我运行了一些代码,找出字符串中的主题标签并将其转换为链接。我使用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
循环内部,这就是生成列表
答案 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);