PHP查找所有Hashtags但不在链接中

时间:2016-09-09 14:33:10

标签: php string

我需要在字符串中查找所有主题标签但不在链接示例中找到:

#q https://www.youtube.com/watch?v=#Vmyx7cyZcKU #q1 #q3 [ I Want to Get only #q, #q1, #q not hashtags in link ]

我的代码:

$string = "#q https://www.youtube.com/watch?v=#Vmyx7cyZcKU #q1 #q3";
// Link
$string = preg_replace("!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i", "<a href='$1' target='_blank'>$1</a>", $string);
// Hashtag
$hashtag_url = $web_url. "hashtag/\\0";
$string = preg_replace("(\s?#\w+)", "<a href='$hashtag_url'>\\0</a>", $string);

见图片我的代码显示!!!

http://i.stack.imgur.com/p8IyE.png

1 个答案:

答案 0 :(得分:2)

匹配URL之外的所有主题标签都可以通过匹配URL的正则表达式实现并丢弃它们,然后匹配所有其他上下文中的hastags:

'~(?:f|ht)tps?://[-a-zA-Zа-яА-Я()0-9@:%_+.\~#?&;/=]+(*SKIP)(*F)|#(\w+)~'

请参阅regex demo

PHP demo

$string = "#q https://www.youtube.com/watch?v=#Vmyx7cyZcKU #q1 #q3";
$string = preg_replace("!(?:f|ht)tps?://[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;/=]+(*SKIP)(*F)|#(\w+)!", "<a href='$1'>$0</a>", $string);
echo $string;

根据您的需要随意调整(尤其是替换模式)。

<强>详情:

  • (?:f|ht)tps?://[-a-zA-Zа-яА-Я()0-9@:%_+.\~#?&;/=]+ - 网址匹配部分(取自您的代码)
  • (*SKIP)(*F) - PCRE动词省略匹配并从当前索引继续进行下一场比赛
  • | - 或
  • #(\w+) - #后跟一个或多个字词。

要启用\w以匹配Unicode字母,请在结尾处添加~u修饰符。