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);
问题出在你的正则表达式上,你可以限制字符数:
/<a\s*href="([^"]+)"[^>]+>([^<]+)<\/a>/
或者使用惰性匹配:
/<a.*?href="([^"]+)"[^>]+>(.+?)<\/a>/
我尝试使用 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);
问题出在你的正则表达式上,你可以限制字符数:
/<a\s*href="([^"]+)"[^>]+>([^<]+)<\/a>/
或者使用惰性匹配:
/<a.*?href="([^"]+)"[^>]+>(.+?)<\/a>/