1

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

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

4

5 回答 5

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'
于 2013-05-30T22:57:05.873 回答
1

在我看来,您的模式与完整字符串正确匹配,但是在捕获组之外消耗了结尾括号...只需将该括号的转义序列移动到捕获组内即可:

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

(你原来的正则表达式读到这个;注意移动的反斜杠)

<\?(?:php)?\s+ReadThis\(([^)]+)\).*?\?>
于 2013-05-30T22:59:45.033 回答
1

此正则表达式不匹配此字符串上的任何内容。

无论如何,要解决您的问题,只需将[^)]替换为以下点即可:

~<\?(?:php)?\s+ReadThis\((.+)\).*?\?>~s
于 2013-05-30T22:52:26.867 回答
1

您不必匹配整个字符串。

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

重要的是要捕获关闭的括号。

于 2013-05-30T22:49:50.553 回答
0

描述

此正则表达式将搜索您的示例字符串并找到 ReadThis 和最外层参数集的内容。

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

在此处输入图像描述

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

我修改了您的搜索:

  • 通过将特殊字符放在方括号内
  • \bphp之前和之后添加readthis以确保您不会意外发现 areadthis作为较大字符串的一部分
  • 在第一个关闭参数之后,我为 0 个或更多非参数添加了第二个匹配项,以防您在其中包含要捕获的其他值。
  • 为 close 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)
        )

)
于 2013-05-31T00:42:59.953 回答