preg_match_all() in php 不显示所有结果
preg_match_all() in php does not show all results
我正在尝试匹配每个 opening 和 closing 自定义标签 <xyz></xyz>
以及它们嵌入正常 html 这些示例中的标签:
$str =<<<'EOS'
<xyz id="x464CaqYxUMjG7RJk4yXa8qY" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi">
<xyz id="x" data-html>
<h2>Security, Comfort, & Convenience</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque dicta magni amet atque doloremque velit unde adipisci omnis hic quaerat.</p>
<p><xyz id="z9Sjvxxop9BiQKc9HMzuk9Z8"></xyz></p>
</xyz>
</xyz>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
<xyz id="ZQpXDHuJHILTVjlRpodO9WrT" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi,y=IyL8raQqbQQM65w7bPWJLRSJ">
<xyz id="x" data-html>
<h2>Security, Comfort, & Convenience</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque dicta magni amet atque doloremque velit unde adipisci omnis hic quaerat.</p>
<p><xyz id="z9Sjvxxop9BiQKc9HMzuk9Z8"></xyz></p>
</xyz>
<xyz id="IyL8raQqbQQM65w7bPWJLRSJ" data-html>
<div class="text-center IyL8raQqbQQM65w7bPWJLRSJ">
<h2>Happy Clients</h2>
<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. </p>
</div>
</xyz>
</xyz>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
EOS;
我在 php:
中使用这个正则表达式
$tag = "/<xyz([^>]+)>|(<\/xyz>)/imu";
$out = array();
$result = \preg_match_all($tag, $str, $out, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
当我打印结果时:
echo nl2br("\n<pre>".\htmlspecialchars($str, ENT_NOQUOTES, ENCODING)."</pre>");
echo \nl2br(\print_r($out, true));
echo preg_last_error();
我可以看到正在打印的子模式([^>]+)
:
[1] => Array
(
[0] => Array
(
[0] => id="x464CaqYxUMjG7RJk4yXa8qY" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi"
[1] => 10
)
...
但 不是 通常应该包含所有表达式的 catch ups 的 0 索引:
Array
(
[0] => Array
(
[0] => Array
(
[0] => **where is the result???**
[1] => 6
)
...
知道我做错了什么吗?
ps:我的正则表达式通过 https://regex101.com/ or http://regexr.com/ 等在线工具使用单个反斜杠 <dil([^>]+)>|<\/dil>
改用更好的解析器方法 (demo)。
例如。以下代码段打印出 /xyz/xyz
下的每个 header (h2
):
<?php
# your string over here
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($your_string_here, LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);
libxml_clear_errors();
# adjust this xpath as needed
$headers = $xpath->query("//xyz/xyz/h2");
foreach ($headers as $header) {
echo $header->textContent . "<br>";
}
?>
这里,唯一要调整的是xpath查询。
问题是您是 "printing" 个 HTML 结果,您的浏览器会自动解析它。
例如在 Firefox 中点击 CTRL+U
将显示页面源代码
是这样的:
如您所见,您的数据就在那里,
例如,尝试在 textarea 中打印您的结果,如下所示:
foreach ($out[0] as $_out) {
echo "<textarea>" . htmlspecialchars($_out[0]) . "</textarea><hr />";
}
你会正常得到结果。
这是另一个例子:https://3v4l.org/hk7Od
我正在尝试匹配每个 opening 和 closing 自定义标签 <xyz></xyz>
以及它们嵌入正常 html 这些示例中的标签:
$str =<<<'EOS'
<xyz id="x464CaqYxUMjG7RJk4yXa8qY" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi">
<xyz id="x" data-html>
<h2>Security, Comfort, & Convenience</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque dicta magni amet atque doloremque velit unde adipisci omnis hic quaerat.</p>
<p><xyz id="z9Sjvxxop9BiQKc9HMzuk9Z8"></xyz></p>
</xyz>
</xyz>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
<xyz id="ZQpXDHuJHILTVjlRpodO9WrT" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi,y=IyL8raQqbQQM65w7bPWJLRSJ">
<xyz id="x" data-html>
<h2>Security, Comfort, & Convenience</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque dicta magni amet atque doloremque velit unde adipisci omnis hic quaerat.</p>
<p><xyz id="z9Sjvxxop9BiQKc9HMzuk9Z8"></xyz></p>
</xyz>
<xyz id="IyL8raQqbQQM65w7bPWJLRSJ" data-html>
<div class="text-center IyL8raQqbQQM65w7bPWJLRSJ">
<h2>Happy Clients</h2>
<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. </p>
</div>
</xyz>
</xyz>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
EOS;
我在 php:
中使用这个正则表达式$tag = "/<xyz([^>]+)>|(<\/xyz>)/imu";
$out = array();
$result = \preg_match_all($tag, $str, $out, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
当我打印结果时:
echo nl2br("\n<pre>".\htmlspecialchars($str, ENT_NOQUOTES, ENCODING)."</pre>");
echo \nl2br(\print_r($out, true));
echo preg_last_error();
我可以看到正在打印的子模式([^>]+)
:
[1] => Array
(
[0] => Array
(
[0] => id="x464CaqYxUMjG7RJk4yXa8qY" data-arg="x=ktvBDojzvthKO9OOBzQLt6pi"
[1] => 10
)
...
但 不是 通常应该包含所有表达式的 catch ups 的 0 索引:
Array
(
[0] => Array
(
[0] => Array
(
[0] => **where is the result???**
[1] => 6
)
...
知道我做错了什么吗?
ps:我的正则表达式通过 https://regex101.com/ or http://regexr.com/ 等在线工具使用单个反斜杠 <dil([^>]+)>|<\/dil>
改用更好的解析器方法 (demo)。
例如。以下代码段打印出 /xyz/xyz
下的每个 header (h2
):
<?php
# your string over here
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($your_string_here, LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);
libxml_clear_errors();
# adjust this xpath as needed
$headers = $xpath->query("//xyz/xyz/h2");
foreach ($headers as $header) {
echo $header->textContent . "<br>";
}
?>
这里,唯一要调整的是xpath查询。
问题是您是 "printing" 个 HTML 结果,您的浏览器会自动解析它。
例如在 Firefox 中点击 CTRL+U
将显示页面源代码
是这样的:
如您所见,您的数据就在那里,
例如,尝试在 textarea 中打印您的结果,如下所示:
foreach ($out[0] as $_out) {
echo "<textarea>" . htmlspecialchars($_out[0]) . "</textarea><hr />";
}
你会正常得到结果。
这是另一个例子:https://3v4l.org/hk7Od