PHP:Preg_match并替换所有

时间:2014-03-30 12:16:01

标签: php preg-replace preg-match

我有一个明显的超链接,我想在文本中替换为普通的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';
    ?>

我该怎么做?

1 个答案:

答案 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...)。