Php 当HTML在一行中时,如何为HTML使用preg_match_all regex?
当我使用格式化的代码时,它工作正常: 正则表达式 但是当我使用未格式化的代码时,正则表达式只使用最后一个而不是使用preg\u match\u all时创建多个部分的Php 当HTML在一行中时,如何为HTML使用preg_match_all regex?,php,html,regex,preg-match-all,Php,Html,Regex,Preg Match All,当我使用格式化的代码时,它工作正常: 正则表达式 但是当我使用未格式化的代码时,正则表达式只使用最后一个而不是使用preg\u match\u all时创建多个部分的: 正则表达式 \\\:\(.+)\ HTML :test1:test2:test3 但是当使用这个时,我得到了数组: Array ( [0] => test1 </div> </li> <li> <div> <a href="#"><stron
:
正则表达式
\\\:\(.+)\
HTML
- :test1
- :test2
- :test3
但是当使用这个时,我得到了数组:
Array
(
[0] => test1 </div> </li> <li> <div> <a href="#"><strong>2</strong></a> : test2 </div> </li> <li> <div> <a href="#"><strong>3</strong></a> : test3
)
数组
(
[0]=>test1:test2:test3
)
如何解决此问题?请尝试以下方法:
<?php
$string = '<ul> <li> <div> <a href="#"><strong>1</strong></a> : test1 </div> </li> <li> <div> <a href="#"><strong>2</strong></a> : test2 </div> </li> <li> <div> <a href="#"><strong>3</strong></a> : test3 </div> </li> </ul>';
$pattern = '#</a>\s*:\s*(.+?)</div>#';
preg_match_all($pattern, $string, $out);
print_r($out);
?>
空格可能会被更改(空格或制表符),因此最好使用
\s
匹配所有空格,即使(\n或\r)默认情况下,+
量词是贪婪的,这意味着(松散地)它将尽可能多地匹配,而正则表达式返回一个整体匹配
例如,+
将在abcefg
中匹配abcefg
:字符串中的每个字符都可以由点
匹配,贪婪的量词会尽可能多地消耗
您要做的是将其设置为惰性,以便尽可能少地匹配+?
:
</a> : (.+?)</div>
您的正则表达式以前工作过,因为默认情况下点
与换行符不匹配。另一方面,不需要转义正则表达式中的所有内容…\s?+:\s?+(.*)\s+
</a>\s?+:\s?+(.*?)\s?+</div>
\\\:\(.+?)\
+1对于格式良好的问题:您根本不应该使用正则表达式来解析HTML。@Teejay请说出您的替代方法。@Bondye您应该使用一些HTML解析器,有很多。正则表达式并不专门用于dyck语言(括号、平衡等),尽管一些正则表达式风格有基本的支持。我读到,?
符号表示懒惰。。。?你能告诉我这是什么意思吗?@Tuga:当它跟在一个量词后面而不是一个字符后面时,就不是了。此外,在您的回答中,在任何\s+?
中确实不需要?
<代码>\s+?(.*?将使\s
仅匹配一个空格,即使有多个空格。在零次和无限次之间匹配任何单个字符«.*?»,尽可能少地匹配,根据需要扩展(惰性)如果文本和结束div之间没有空格,那么\s+/code>中的+
也会使正则表达式失败:请参阅:foobar
示例。\s++
不会按照您的想法执行,它会使?
量词成为所有格。如果您想说“零或更多”,您需要使用*
量词:\s*:\s*(*)?\s*
<ul> <li> <div> <a href="#"><strong>1</strong></a> : test1 </div> </li> <li> <div> <a href="#"><strong>2</strong></a> : test2 </div> </li> <li> <div> <a href="#"><strong>3</strong></a> : test3 </div> </li> </ul>
Array
(
[0] => test1 </div> </li> <li> <div> <a href="#"><strong>2</strong></a> : test2 </div> </li> <li> <div> <a href="#"><strong>3</strong></a> : test3
)
<?php
$string = '<ul> <li> <div> <a href="#"><strong>1</strong></a> : test1 </div> </li> <li> <div> <a href="#"><strong>2</strong></a> : test2 </div> </li> <li> <div> <a href="#"><strong>3</strong></a> : test3 </div> </li> </ul>';
$pattern = '#</a>\s*:\s*(.+?)</div>#';
preg_match_all($pattern, $string, $out);
print_r($out);
?>
Array
(
[0] => Array
(
[0] => : test1
[1] => : test2
[2] => : test3
)
[1] => Array
(
[0] => test1
[1] => test2
[2] => test3
)
)
</a> : (.+?)</div>
</a> : ([^<]+)</div>
</a>\s?+:\s?+(.*?)\s?+</div>