preg_match_all returns 仅来自单行的最后匹配,但来自多行字符串的所有匹配

preg_match_all returns only last matches from single row , but all matches from multi row string

我尝试使用 preg_match_all 函数查找文本中出现的所有子字符串:

<?php

$str = '<p>this <a href="https://api.slack.com/apps/" target="_blank">link</a> and <a href="https://www.google.com" target="_blank">link 2</a></p>';



$reg = '/<a.*href="([^"]+)"[^>]+>(.+)<\/a>/';

preg_match_all($reg, $str, $m);

print_r($m);

但上面的代码 return 仅在最后 link: run php online

当我将源文本拆分成行时,相同的代码 return 全部匹配:

<?php

$str = '<p>this <a href="https://api.slack.com/apps/" target="_blank">link</a> and 
the <a href="https://www.google.com" target="_blank">link 2</a></p>';



$reg = '/<a.*href="([^"]+)"[^>]+>(.+)<\/a>/';

preg_match_all($reg, $str, $m);

print_r($m);

php sandbox here

问题出在你的正则表达式上,你可以限制字符数:

/<a\s*href="([^"]+)"[^>]+>([^<]+)<\/a>/

或者使用惰性匹配:

/<a.*?href="([^"]+)"[^>]+>(.+?)<\/a>/