0

我有一些代码正在运行,它找出字符串中的主题标签并将它们转换为链接。我已经使用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循环中,它正在生成列表

4

1 回答 1

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);
于 2013-04-25T15:55:19.247 回答