我有一些带有许多链接的文本,其中一些具有嵌套的链接。我正在尝试创建一个正则表达式,以删除链接锚中的所有链接,并保留锚文本。
我的想法是使用正则表达式来查找所有文本锚,并用已删除标签的相同文本替换它们。但是我无法实现。
示例:
<p>Any text <a href="#">a correct link</a> more text <a href="#">some <a href="#">word</a>.</a><p>
预期结果
<p>Any text <a href="#">a correct link</a> more text <a href="#">some word.</a><p>
我正在尝试的结果是:
$pattern="/<a.*>([a-zA-Z ].*)<\/a>/";
preg_match_all ($pattern , $text, $matches);
foreach($matches as $match)
{
$text=str_replace($match[0],strip_tags($match[0],'<b>'),$text);
}
答案 0 :(得分:0)
您可以使用以下内容:
$pattern = '/<a.*>.*(<a.*>(.*)<\/a>(.*))<\/a>/m';
$text = '<p>Any text <a href="#">a correct link</a> more text <a href="#">some <a href="#">word</a>.</a><p>';
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER, 0);
$matches = $matches[0];
$to_search = $matches[1];
unset($matches[0], $matches[1]);
$to_replace = '';
foreach($matches AS $match)
$to_replace .= $match;
$str = str_replace($to_search, $to_replace, $text);
我希望这会有所帮助。
让我知道是否需要更多帮助。
答案 1 :(得分:0)
最后我以这种方式解决了
$pattern = '/<a.*>([a-zA-Z0-9&#;\s]*<a.*>[a-zA-Z0-9&#;\s]*<\/a>[a-zA-Z0-9&#;\s]*)<\/a>/m';
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER, 0);
foreach($matches as $match)
{
$text = str_replace($match[1], strip_tags($match[1]), $text);
}
return $text;
老实说,我不认为这是最好的方法,但是在大多数情况下都是可行的。
感谢您的提示Mohammad Bagheri。