4

我有一个 PHPpreg_match_all和 REGEX 问题。

我有以下代码:

<?php

$string= 'attribute1="some_value" attribute2="<h1 class=\"title\">Blahhhh</h1>"';

preg_match_all('/(.*?)\s*=\s*(\'|"|&#?\w+;)(.*?)\2/s', trim($string), $matches);

print_r($matches);

?>

对于我想用引号传入 HTML 的实例,这似乎没有提取转义引号。我已经尝试了许多解决方案,其中包含引号 REGEX 修复中的基本引号,但似乎没有一个对我有用。我似乎无法将它们正确放置在这个预先存在的 REGEX 中。

我不是 REGEX 大师,有人可以指点我正确的方向吗?

我想要达到的结果是这样的:

Array
(
    [0] => Array
        (
            [0] => attribute1="some_value"
            [1] =>  attribute2="<h1 class=\"title\">Blahhhh</h1>"
        )

    [1] => Array
        (
            [0] => attribute1
            [1] =>  attribute2
        )

    [2] => Array
        (
            [0] => "
            [1] => "
        )

    [3] => Array
        (
            [0] => some_value
            [1] => <h1 class=\"title\">Blahhhh</h1>
        )
)

谢谢。

4

1 回答 1

1

您可以使用否定的后向断言来解决此问题:

'/(.*?)\s*=\s*(\'|"|&#?\w+;)(.*?)(?<!\\\\)\2~/'
                                 ^^^^^^^^^

结束引号不应以\. 给我:

Array
(
    [0] => Array
        (
            [0] => attribute1="some_value"
            [1] =>  attribute2="<h1 class=\"title\">Blahhhh</h1>"
        )

    [1] => Array
        (
            [0] => attribute1
            [1] =>  attribute2
        )

    [2] => Array
        (
            [0] => "
            [1] => "
        )

    [3] => Array
        (
            [0] => some_value
            [1] => <h1 class=\"title\">Blahhhh</h1>
        )
)

这个正则表达式并不完美,因为它是你的实体,但在那里作为分隔符,就像引号一样,它也可以用\. 不知道这是否真的是有意的。

另请参阅这个很好的问题/答案:Split string by delimiter, but not if it is escaped

于 2012-04-19T19:38:05.053 回答