PHP查找所有hashtag,但在链接中找不到

PHP查找所有hashtag,但在链接中找不到,php,string,Php,String,我需要在字符串中查找所有hashtag,但不在链接中查找示例: #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

我需要在字符串中查找所有hashtag,但不在链接中查找示例:

#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);

匹配URL之外的所有hashtags可以通过一个正则表达式来实现,该正则表达式匹配URL并丢弃它们,然后在所有其他上下文中匹配hasttags:

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

:

$string=“#qhttps://www.youtube.com/watch?v=#Vmyx7cyZcKU #q1#q3”;
$string=preg_replace(“!(?:f|ht)tps:/[-a-zA-Zа-a-zA-a-Я()0-9@:%+.~~#?&;/=”+(*跳过)(*f)#(\w+),“,$string);
echo$字符串;
根据您的需要随时调整(特别是更换模式)

详细信息

  • (?:f|ht)tps?:/[-a-zA-Zа-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-9@:%\+.\~+.\~?&/=]+
    -URL匹配部分(取自您的代码)
  • (*SKIP)(*F)
    -PCRE谓词忽略匹配项并从当前索引继续进行下一个匹配项
  • |
    -或
  • #(\w+
    -a
    #
    后跟一个或多个单词字符

要使
\w
也匹配Unicode字母,请在末尾添加
~u
修饰符。

URL中的哈希具有特定含义。它之后的所有内容都称为片段(其他名称可能适用)。它们通常不会被发送到服务器上。那么那些有其他字符的URL呢,比如,阿拉伯语、希伯来语等等?换句话说,我的意思是,
[-a-zA-Zа-ЯА-Я()0-9@:%+.~#?&/=]
您的代码很好,但代码只查找哈希标记而不查找链接?这个答案只显示了如何获得所需的结果。有很多URL正则表达式,所以,选择一个你需要的。至于URL匹配部分,你可以只使用
(?:ht | f)tps?://\S+
(?:ht | f)tps?://\S+不好,兄弟不工作显示错误警告:preg|u replace():未知修饰符't'
'~(?:f|ht)tps?://[-a-zA-Zа-яА-Я()0-9@:%_+.\~#?&;/=]+(*SKIP)(*F)|#(\w+)~'
$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;