【问题标题】:PHP converting plain text to hashtag linkPHP将纯文本转换为标签链接
【发布时间】:2014-04-07 18:54:27
【问题描述】:

我正在尝试使用 PHP 将用户的帖子(文本)转换为主题标签可点击链接。

根据我的发现,主题标签应该只包含字母数字字符。

$text = 'Testing#one #two #three.test';
$text = preg_replace('/#([0-9a-zA-Z]+)/i', '<a href="/hashtag/$1">#$1</a>', $text);

它将链接放在所有(#one #two #three)上,但我认为 #one 不应该被转换,因为它紧挨着另一个字母数字字符,如何调整正则表达式来解决这个问题?

第三个也可以,只匹配#three,我认为是正确的。

【问题讨论】:

  • 我不确定你在这里问什么 - 你可能会在 StackOverflow 上得到更好的答案。你能澄清一下你的预期结果是什么吗?
  • 我打算在 StackOverflow 上发布它,我一定打开了多个标签。但我认为问题很明确,我看不到改进它的方法。

标签: php regex twitter


【解决方案1】:

您可以修改您的正则表达式以包含非空白字符的否定后视,如下所示:

(?<!\S)#([0-9a-zA-Z]+)

工作正则表达式示例:

http://regex101.com/r/mR4jZ7

PHP:

$text = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/', '<a href="/hashtag/$1">#$1</a>', $text);

编辑: 并使表达式与其他语言(非英文字符)兼容:

(?<!\S)#([0-9\p{L}]+)

工作示例:

https://regex101.com/r/Pquem3/1

【讨论】:

  • 谢谢,也许您还想添加完整代码:$text = preg_replace('/(?&lt;!\S)#([0-9a-zA-Z]+)/m', '&lt;a href="/hashtag/$1"&gt;#$1&lt;/a&gt;', $text);
  • 不客气!是的,我编辑了答案以包含 PHP 代码。谢谢。 :)
  • @adrianTNT,是的,你可以这样做:(?&lt;!\S)#([^0-9][0-9a-zA-Z]+)
  • 我读过一些规范说主题标签只能以字母开头,但我看到 twitter 允许这样做。代码虽然有效。
  • @MElliott 大家好,非常感谢您的回答,我发现它不适用于中文或其他单词。#печаль #грусть #fıstıklıbaklava #чайная #джаз 你能告诉我为什么吗?
【解决方案2】:

使用uni-code,html安全编码并加入正则表达式; ~(?&lt;!&amp;)#([\pL\d]+)~u

这里some&amp;#39;s tags like #tag1 #tag2#tag3等等。

【讨论】:

    【解决方案3】:

    要在没有第一个的情况下捕获第二个和第三个主题标签,您需要指定主题标签应该从行首开始,或者在多个空格字符之一之前,如下所示:

    $text = 'Testing#one #two #three.test';
    $text = preg_replace('/(^|\s+)#([0-9a-zA-Z]+)(\b|$)/', '$1<a href="/hashtag/$2">#$2</a>', $text);
    

    第三组中的\b 定义了一个单词边界,当它紧跟一个非单词字符时,它允许模式匹配#three。

    编辑:MElliott 上面的回答更有效,记录在案。

    【讨论】:

      【解决方案4】:

      最后我找到了解决方案,例如:facebook 或其他主题标签到 url 解决方案,它也可能对您有所帮助。此代码也适用于 unicode。我使用了一些 Bangla Unicode,让我知道其他语言也可以,我认为它适用于任何语言。

      $str = '#Your Text #Unicode #ফ্রিকেলস বা #তিল মেলানিনের #অতিরিক্ত উৎপাদনের জন‍্য হয় যা #সূর্যালোকে #বাড়ে';
      $regex = '/(?<!\S)#([0-9a-zA-Z\p{L}\p{M}]+)/mu';
      $text = preg_replace($regex, '<a href="' . BASE . 'search?q=$1">#$1</a>', $str);
      echo $text;
      

      【讨论】:

      • 6 年前发布了使用 Unicode 字符的解决方案,更不用说对已接受答案的编辑了。这对那些解决方案有改进吗?如何?编辑您的问题以包含此信息。 \p{L} 不包括 a-z 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2016-04-04
      • 2023-03-11
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多