Php 当HTML在一行中时,如何为HTML使用preg_match_all regex?

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

当我使用格式化的代码时,它工作正常:

正则表达式

但是当我使用未格式化的代码时,正则表达式只使用最后一个而不是使用preg\u match\u all时创建多个部分的

正则表达式

\\\:\(.+)\
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>