正则表达式帮助 - PHP

时间:2010-06-04 12:36:59

标签: regex

$data = "<Data>hello</Data>";
preg_match_all("/\<Data\>[.]+\<\/Data\>/", $data, $match);
print_r($match);

返回:

Array ( [0] => Array ( ) )

所以我猜测没有匹配?

6 个答案:

答案 0 :(得分:2)

preg_match_all("#<Data>.+</Data>#", $data, $match);

如果你想使用/作为分隔符:

preg_match_all("/<Data>.+<\/Data>/", $data, $match);

主要问题是字符类中的.与文字句点匹配。此外,使用不同的分隔符可以消除转义。请注意,您无需以任何方式转义<。如果您希望能够提取内部值,请使用:

preg_match_all("#<Data>(.+)</Data>#", $data, $match);

“你好”现在将在你的例子中$matches[1]。请注意,正则表达式不适合解析XML,因此切换到真正的解析器以获取任何非常重要的内容。

答案 1 :(得分:2)

您正在使用[]和。不正确。

试试这个:

$data = "<Data>hello</Data>";
preg_match_all("/\<Data\>.+\<\/Data\>/", $data, $match);
print_r($match);

当您使用[]定义可能的字符列表时,在您的情况下,您定义的字符限于。只要。如果你想使用。定义你必须在[]之外使用它的任何特征。

答案 2 :(得分:2)

<?php

$data = "<Data>hello</Data>";
preg_match_all('#<Data>(.+)</Data>#', $data, $match);
print_r($match);

?>

输出:(as seen on ideone.com

Array
(
    [0] => Array
        (
            [0] => <Data>hello</Data>
        )

    [1] => Array
        (
            [0] => hello
        )

)

[...]是一个字符类定义。您可以使用(...)来捕获。

参考


关于不情愿匹配的特别说明

由于您使用的是preg_match_all,因此请注意您目前正在贪婪地进行匹配。也就是说,只有一个匹配,例如<Data>hello</Data><Data>how are you</Data>see on ideone.com)。

如果您想要两个<Data>元素,那么您必须使用不情愿的匹配'#<Data>(.+?)</Data>#'see on ideone.com)。

举例说明:

----A--Z----A----Z----
    ^^^^^^^^^^^^^^
        A.*Z

上述输入中只有一个A.*Z匹配。


关于解析HTML / XML的正则表达式的特别说明

这是一种痛苦。如果可能的话,使用适当的HTML / XML解析器。 PHP有很多。

答案 3 :(得分:1)

在字符类内部,点只是一个点。

<?php  

    $data = "<Data>hello</Data>";
    preg_match_all("/\<Data\>.+\<\/Data\>/", $data, $match);
    print_r($match);

?>

将屈服:

Array
(
    [0] => Array
        (
            [0] => <Data>hello</Data>
        )

)

答案 4 :(得分:0)

试试这个。你不需要围绕。

的括号
"/\<Data\>.+\<\/Data\>/"

答案 5 :(得分:0)

/<Data>([^<^>]+)\<\/Data\>/

$data = "<Data>hello</Data>";
preg_match_all("/<Data>([^<^>]+)\<\/Data\>/", $data, $match);

print_r($match);