【问题标题】:Explode and/or regex text to HTML link in PHP在 PHP 中展开和/或正则表达式文本到 HTML 链接
【发布时间】:2014-10-24 22:45:48
【问题描述】:

我有一个文本数据库,其中包含英语句子中间的这种语法,我需要使用 PHP 将其转换为 HTML 链接

"text1(text1)":http://www.example.com/mypage

注意事项:

  • text1 始终与括号中的文本相同

  • 整个字符串总是有引号、括号、冒号,所以每个的语法都是一样的。

  • 有时字符串末尾有一个空格,但有时有问号或逗号或其他标点符号。

  • 我需要把这些变成基本链接,比如

<a href="http://www.example.com/mypage">text1</a>

我该怎么做?我需要explode 或regex 还是两者都需要?

【问题讨论】:

  • 网址后面总是有空格或其他东西吗? text1 可以包含括号或转义引号吗?
  • text1 不包含任何标点符号。有时网址末尾有空格,但有时有问号或逗号或其他标点符号。
  • 英文句子中间,是句子的例子吗?无法使用简单的正则表达式解析 URL。除了分隔符看起来像 "()": 之外,这会不会与句子的其他部分发生冲突?

标签: php html regex href explode


【解决方案1】:
"(.*?)\(\1\)":(.*\/[a-zA-Z0-9]+)(?=\?|\,|\.|$)

你可以用这个。

查看演示。

http://regex101.com/r/zF6xM2/2

【讨论】:

  • +1 用于使用简单的解决方案(反向引用),但是 but other times there is a question mark or comma or other punctuation mark - 可以使用 [\?\.\,]? 或类似的卡在最后一个捕获组之外,否则这个尾随标点符号将在 url 中。并且:text1 doesn't contain any punctuation mark,第一组可以更严格。
【解决方案2】:

你可以使用这个替换:

$pattern = '~"([^("]+)\(\1\)":(http://\S+)(?=[\s\pP]|\z)~'; 

$replacement = '<a href="\2">\1</a>'; 

$result = preg_replace($pattern, $replacement, $text);

图案细节:

([^("]+)这部分将捕获组1中的text1。使用否定字符类(不包括双引号和左括号)的优点是多个:

  • 它允许使用贪婪量词,这样更快
  • 由于该类不包括左括号并且在模式中紧跟一个括号,如果在文本的其他部分中有双引号之间的内容但内部没有括号,则正则表达式引擎将不会向后测试其他可能性,它将跳过这个子字符串而不回溯。 (这是因为 PCRE 正则表达式引擎在处理字符串之前会自动将[^a]+a 转换为[^a]++a

\S+ 表示 所有不是空格的内容一次或多次

(?=[\s\pP]|\z) 是一个lookahead assertion,用于检查 url 后面是否跟有空格、标点符号 (\pP) 或字符串的结尾。

【讨论】:

  • 感谢您的回答和解释。我对其进行了测试,它确实有效。
  • @break68:我为你感到高兴。但是要小心问号,因为它可以在最后一个 url (用于 GET 值但没有 GET 值)。在这种情况下,网址末尾的问号将被“转换”为尾随问号。我不知道你必须处理的网址,但这可能是一个陷阱。
【解决方案3】:

你可以使用这个正则表达式:

"(.*?)\(.*?:(.*)

Working demo

【讨论】:

  • 我认为您不需要包含屏幕截图。
  • 其实是个好主意。清楚地显示正则表达式,无需转到实际链接。 @Fede 表达你的好方法。
  • 感谢正则表达式和屏幕截图。 :-)
【解决方案4】:

适当的正则表达式可以是:

$str = '"text1(text1)":http://www.example.com/mypage';
preg_match('#^"([^\(]+)' .
           '\(([^\)]+)\)[^"]*":(.+)#', $str, $m);
print '<a href="'.$m[3].'">'.$m[2].'</a>' . PHP_EOL;

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2010-12-31
    相关资源
    最近更新 更多