$data = "<Data>hello</Data>";
preg_match_all("/\<Data\>[.]+\<\/Data\>/", $data, $match);
print_r($match);
返回:
Array ( [0] => Array ( ) )
所以我猜测没有匹配?
答案 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);
?>
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解析器。 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);