2013-05-30 221 views
1

我有以下字符串"<?php jifoafj sfjifasjfoasjfifajs ReadThis(array('type' => 'button', 'value' => 35)) oisfjoijsiofsa sffas ?>"正則表達式得到括號PHP

我想要得到什麼裏面ReadThis。

這是正則表達式到目前爲止,

preg_match_all('~<\?(?:php)?\s+ReadThis\(([^)]+)\).*?\?>~s',$thestring,$matches) ;

好吧,但我正在逐漸

array('type' => 'button', 'value' => 35

我要的是

array('type' => 'button', 'value' => 35)

瓦at是完成此任務的最佳方法?這與Chomsky Hierarchy有什麼關係嗎?

+0

什麼是鉻層次? –

+0

我在網上尋找答案,我遇到了一個叫做喬姆斯基層次結構的東西。 http://en.wikipedia.org/wiki/Chomsky_hierarchy –

+0

你是否事先知道'ReadThis()'裏面有多少對括號?如果你這樣做,你可以用一個正則表達式來解決這個問題。如果它可以任意多,你不能用正則表達式解決這個問題。 – Patashu

回答

0

說明

此正則表達式將搜索您的樣本字符串,找到ReadThis和最外側設置的parans的內容。

<[?](?:php\b)?.*?\s\bReadThis[(]([^)]+[)][^)]*)[)].*?[?]>

enter image description here

0集團將獲得整個字符串,而第1組將通過最後巴蘭有readthis。

我修改你的搜索:

  • 通過將特殊字符方括號
  • phpreadthis前加入\b內,以確保您不會意外地發現一個readthis一個較大的字符串
  • 的一部分
  • 在第一次關閉paran後,我添加了第二個匹配的0個或更多的非parans,因爲你有額外的值,你想捕捉。
  • 增加了第二場比賽的接近巴拉那,以確保它真的存在

PHP實例

<?php 
$sourcestring="<?php jifoafj sfjifasjfoasjfifajs ReadThis(array('type' => 'button', 'value' => 35)) oisfjoijsiofsa sffas ?>"; 
preg_match_all('/<[?](?:php\b)?.*?\s\bReadThis[(]([^)]+[)][^)]*)[)].*?[?]>/im',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

$matches Array: 
(
    [0] => Array 
     (
      [0] => <?php jifoafj sfjifasjfoasjfifajs ReadThis(array('type' => 'button', 'value' => 35)) oisfjoijsiofsa sffas ?> 
     ) 

    [1] => Array 
     (
      [0] => array('type' => 'button', 'value' => 35) 
     ) 

) 
1

您不必匹配整個字符串。

(ReadThis\((array\([^)]+\))\)) 

重要的是要捕獲關閉的parens。

+1

它只會匹配這個特定的字符串,但如果輸入是:'<?php ReadThis(array('type'=>'button','value'=> 35), 'foo'); '那麼它可能不會。 – anubhava

1

此正則表達式不匹配此字符串上的任何內容。

總之,要解決您的問題中庸之道通過像點更換[^)]

~<\?(?:php)?\s+ReadThis\((.+)\).*?\?>~s 
1

您可以使用此模式:

ReadThis(\((?:[^()]++|(?1))+\)) 

例子:

$pattern = '~ReadThis(\((?<result>(?:[^()]++|(?1))+)\))~'; 
$subject = <<<'LOD' 
< ?php jifoafj sfjifasjfoasjfifajs ReadThis(array('type' => 'button', 'value' => 35)) oisfjoijsiofsa sffas sdfsdf sd 
ReadThis(array('type' => 'button', 'value' => 35), 'foo') ? > 
LOD; 
preg_match_all($pattern, $subject, $matches); 
print_r($matches['result']); 

您獲得:

array('type' => 'button', 'value' => 35) 
array('type' => 'button', 'value' => 35), 'foo' 
+1

此處使用遞歸模式+1。據我所知,這是唯一的方法。你可能想做到:'ReadThis \ s *(\((??(?:[^()] ++ |(?1))+)\))'雖然。 – anubhava

1

它看起來對我來說,你的模式完整的字符串匹配正確,但您的捕獲組之外消耗的結局括號...只要移動轉義序列,用於括號捕獲組內,而不是:

<\?(?:php)?\s+ReadThis\(([^)]+\)).*?\?> 

(其中您的原始正則表達式讀取此;注意移動反斜線)

<\?(?:php)?\s+ReadThis\(([^)]+)\).*?\?>