正则表达式得到括号PHP

时间:2013-05-30 22:43:17

标签: php regex

我有以下字符串"<?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)

实现这一目标的最佳方法是什么?这对乔姆斯基层次结构有什么看法吗?

5 个答案:

答案 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[(]([^)]+[)][^)]*)[)].*?[?]>

enter image description here

组0将接收整个字符串,组1将通过最后一个参数读取。

我修改了你的搜索:

  • 将特殊字符放在方括号内
  • \b之后和php之前添加readthis,以确保您不会意外地找到readthis作为较大字符串的一部分
  • 在第一次关闭paran之后,我添加了第二场比赛,对于0或更多的非对话,如果你想要捕获其他值,你可以使用其他值。
  • 为关闭的paran添加了第二场比赛以确保它真的存在

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)
        )

)