preg_replace Sinsde Paragparah 广告主播 link

preg_replace insade paragprah add anchor link

我想将段落内的文本转换为锚点link。

$change = array(
    'google' => 'www.google.com',
    'facebook' => 'www.facebook.com',
);

$text = "
    <h1>Search on google for facebook</h1>
    <p>Search on google for facebook</p>
";

foreach ($change as $word => $url) {
    $sentence = preg_replace('@(?<=\W|^)('.$word.')(?=\W|$)@i', '<a href="'.$url.'"></a>', $text);
}
echo $sentence;

我要这样果断:

<h1>Search on google for facebook</h1>
<p>Search on <a href="www.google.com">google</a> for <a href="www.facebook.com">facebook</a></p>

您可以先尝试匹配 p 标签,然后在 preg_replace_callback 匿名函数中执行所有替换:

$change = array(
    'google' => 'www.google.com',
    'facebook' => 'www.facebook.com',
);

$text = "
    <h1>Search on google for facebook</h1>
    <p>Search on google for facebook</p>
";

$sentence = preg_replace_callback('~(<p\b[^>]*>)(.*?)(</p>)~s', function($m) use ($change) {
        return $m[1] . preg_replace(
              array_map(function ($x) { return '@(?<=\W|^)('.preg_quote($x, "@").')(?=\W|$)@i'; }, array_keys($change)),
              array_map(function ($y) { return '<a href="'. $y .'"></a>'; }, array_values($change)),
              $m[2]). $m[3]; }
, $text);

echo $sentence;

参见PHP demo