我有以下字符串"<?php jifoafj sfjifasjfoasjfifajs ReadThis(array('type' => 'button', 'value' => 35)) oisfjoijsiofsa sffas ?>"
我想在ReadThis中找到任何内容。
到目前为止这是正则表达式,
preg_match_all('~<\?(?:php)?\s+ReadThis\(([^)]+)\).*?\?>~s',$thestring,$matches) ;
好的,但我正在
array('type' => 'button', 'value' => 35
我想要的是
array('type' => 'button', 'value' => 35)
实现这一目标的最佳方法是什么?这对乔姆斯基层次结构有什么看法吗?
答案 0 :(得分:1)
您不必匹配整个字符串。
(ReadThis\((array\([^)]+\))\))
重要的是捕获那些关闭的parens。
答案 1 :(得分:1)
此正则表达式与此字符串上的任何内容都不匹配。
无论如何,为了解决您的问题,请用以下几点替换 [^)] :
~<\?(?:php)?\s+ReadThis\((.+)\).*?\?>~s
答案 2 :(得分: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'
答案 3 :(得分:1)
在我看来,你的模式正确地匹配了完整的字符串,但是在你的捕获组之外消耗了结尾的paren ......只需在捕获组中移动该paren的转义序列:
<\?(?:php)?\s+ReadThis\(([^)]+\)).*?\?>
(原始正则表达式读取此内容;请注意移动的反斜杠)
<\?(?:php)?\s+ReadThis\(([^)]+)\).*?\?>
答案 4 :(得分:0)
此正则表达式将搜索您的示例字符串,并找到ReadThis和最外面的一组parans的内容。
<[?](?:php\b)?.*?\s\bReadThis[(]([^)]+[)][^)]*)[)].*?[?]>
组0将接收整个字符串,组1将通过最后一个参数读取。
我修改了你的搜索:
\b
之后和php
之前添加readthis
,以确保您不会意外地找到readthis
作为较大字符串的一部分<?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)
)
)