我有一个明显的超链接,我想在文本中替换为普通的HTML超链接。 所以这适用于一个超链接:
$string = '<u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"A Youtube Video</u>';
$pattern = '/http[?.:=\\w\\d\\/]*/';
$namePattern = '/(?:")([\\s\\w]*)</';
preg_match($pattern, $string, $matches);
preg_match($namePattern, $string, $nameMatches);
echo '<a href="'.$matches[0].'">'.$nameMatches[1].'</a>';
但是文本中只有一个超链接,所以我只想更改所有这些超链接:
<?php
$input = 'Blablabla Beginning Text <u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"1.A Youtube Video</u> blablabla Text Middle <u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"2. A Youtube Video</u> blabla Text after';
//To become:
$output = 'Blablabla Beginning Text <a href="http://www.youtube.com/watch?v=A0VUsoeT9aM">1. A Youtube Video</a>blablabla Text Middle <a href="http://www.youtube.com/watch?v=A0VUsoeT9aM">2. A Youtube Video</a> blabla Text after';
?>
我该怎么做?
答案 0 :(得分:1)
因此,您想要替换找到的匹配项,然后使用preg_replace()
来完成相同的操作。但是,您遇到了一个明显的问题:目前有两个preg_match()
个实例 - 是否应该由preg_replace()
的两个实例替换?没有。结合它们。
$pattern = '/http[?.:=\w\d\\/]*/';
$namePattern = '/(?:")([\s\w]*)</';
可以合并到(我将.
添加到$namePattern
部分,因此它可以使用第二个示例文本,其中链接描述包含一个点):< / p>
$replacePattern = '/(http[?.:=\w\d\\/]*)\\\\"([\s\w.]*)</';
因为链接和文本在原始文本中由\\"
分隔。我通过preg_match_all()
进行了测试,看看这种模式是否有效。此外,通过将()
添加到第一个模式,它们现在已分组。
$replacePattern = '/(http[?.:=\w\d\\/]*)\\\\"([\s\w.]*)</';
// ^-group1-----------^ ^-group2-^
现在可以在替换声明中使用这些组合。
$replaceWith = '<a href="\\1">\\2</a><';
\\1
指向第一组,\\2
指向第二组。最后<
是必要的,因为preg_replace()
将替换整个找到的模式(不仅仅是组),并且由于<
位于模式的末尾,如果它{},我们将失去它没有替换部分。
您现在需要的只是使用以下参数调用preg_replace()
:
$output = preg_replace($replacePattern, $replaceWith, $string);
$replacePattern
的所有出现现在都将替换为$replaceWith
版本,并保存在变量$output
中。
你可以看到它here。
如果您想要移除较大的部分,只需扩展$replacePattern
。
$replacePattern = '/<u>.*?(http[?.:=\w\d\\/]*)\\\\"([\s\w.]+)<\/u>/';
$replaceWith = '<a href="\\1">\\2</a>';
(请参阅here).*?
将匹配所有内容并且不贪心,这意味着一旦发现之后发生的任何事情,它就会停止(所以在这里是http...
)。