合并preg_match_all和preg_replace

时间:2013-04-25 12:53:24

标签: php preg-replace preg-match-all

我运行了一些代码,找出字符串中的主题标签并将其转换为链接。我使用preg_match_all完成了此操作,如下所示:

if(preg_match_all('/(#[A-z_]\w+)/', $postLong, $arrHashTags) > 0){
foreach ($arrHashTags[1] as $strHashTag) {
  $long = str_replace($strHashTag, '<a href="#" class="hashLinks">'.$strHashTag.'</a>', $postLong);

    }   
}

另外,对于我的搜索脚本,我需要在结果字符串中加粗搜索的关键字。与使用preg_replace的以下代码类似的东西:

$string = "This is description for Search Demo";
$searchingFor = "/" . $searchQuery . "/i";
$replacePattern = "<b>$0<\/b>";
preg_replace($searchingFor, $replacePattern, $string);

我遇到的问题是两者必须一起工作,应该作为组合结果抛出。我能想到的一种方法是使用preg_match_all代码从preg_replace运行结果字符串,但如果标记和搜索的字符串相同怎么办?第二个块也会加粗我的标记,这是不可取的。

根据下面给出的答案

更新我正在运行的代码,但它仍无法正常运行

if(preg_match_all('/(#[A-z_]\w+)/', $postLong, $arrHashTags) > 0){
foreach ($arrHashTags[1] as $strHashTag) {
  $postLong = str_replace($strHashTag, '<a href="#" class="hashLinks">'.$strHashTag.'</a>', $postLong);

    }   
}

在此之后,我立即运行

 $searchingFor = "/\b.?(?<!#)" . $keystring . "\b/i";
 $replacePattern = "<b>$0<\/b>";
 preg_replace($searchingFor, $replacePattern, $postLong);

您知道,这一切都在while循环内部,这就是生成列表

1 个答案:

答案 0 :(得分:0)

您只需要修改搜索模式,以避免以“#”

开头
$postLong = "This is description for Search Demo";

if(preg_match_all('/(#[A-z_]\w+)/', $postLong, $arrHashTags) > 0){
  foreach ($arrHashTags[1] as $strHashTag) {
    $postLong = str_replace($strHashTag, '<a href="#" class="hashLinks">'.$strHashTag.'</a>', $postLong);
  }
}

#  This expression finds any text with 0 or 1 characters in front of it
# and then does a negative look-behind to make sure that the character isn't a #
searchingFor = "/\b.?(?<!#)" . $searchQuery . "\b/i";
$replacePattern = "<b>$0<\/b>";
preg_replace($searchingFor, $replacePattern, $postLong);

或者,如果您出于其他原因不需要可用哈希数组,则只能使用preg_replace。

$postLong = "This is description for #Search Demo";

$patterns = array('/(#[A-z_]\w+)/', "/\b.?(?<!#)" . $searchQuery . "\b/i");
$replacements = array('<a href="#" class="hashLinks">'.$0.'</a>', ' "<b>$0<\/b>');
preg_replace($patterns, $replacements, $postLong);