【问题标题】:How can I create my own regex for "parse" HTML links?如何为“解析”HTML 链接创建自己的正则表达式?
【发布时间】:2011-05-09 11:23:01
【问题描述】:

字符串看起来像超链接,例如http://somethings。这就是我需要的:

  1. 只有当它们不以字符" 开头时,我才需要检查它们;我的意思是,只有那些字符:如果之前没有字符,它必须检查;
  2. 那个somethings字符串表示除了空格(结束标记链接)之外的所有字符都可以使用(当然是链接);我知道,这是 RFC 允许的,但这是我知道的唯一逃避方式;
  3. 这些字符串之前使用htmlentities($str, ENT_QUOTES, "UTF-8") 过滤,这就是为什么可以使用各种字符的原因。它安全吗?还是我冒着 xss 或 html 损坏的风险?
  4. 此替换的出现次数可以是多次,而不仅仅是 1,而且必须不区分大小写;

这是我的实际正则表达式:

preg_replace('#\b[^"](((http|https|ftp)://).+)#', '<a class="lforum" href="$1">$1</a>', $str);

但它只检查那些以“开头的字符串,我想要相反的结果。回答这个问题的任何帮助都会很好,谢谢!

【问题讨论】:

  • 1 - 您需要将单词拆分为单独的字符串。那么正则表达式将是[^"].*
  • [^"] 应该可以工作,但如果这个词是第一个词,它不会(因为之前没有任何字符。

标签: php regex


【解决方案1】:

对于这两种情况,您都需要后向断言。

  1. \b(?&lt;!")(\w)\b - 仅当前面没有 " 时才匹配负后向匹配
  2. (?&lt;=ThisShouldBePresent://)(.*) - 仅当前面有您的字符串时才匹配的正向向后查找。

【讨论】:

  • 用其他一些进一步的信息编辑了主题(因为这实际上效果不佳);请告诉我,感谢您的宝贵时间
【解决方案2】:
  1. 类似这样的:preg_match('/\b[^"]/',$input_string);

    这会查找一个分词符 (\b),后跟除双引号 ([^"]) 以外的任何字符。

  2. 类似这样的:preg_match('~(((ThisShouldBePresent)://).+)~');

    我假设您在问题中指定的括号(和加号)是正则表达式的一部分,而不是要搜索的字符。

    我还采纳了@ThiefMaster 的建议,将分隔符更改为~,以避免转义//

【讨论】:

  • 您可能想为 (2) 使用不同的分隔符,这样您就不会逃跑了 - 例如,# 可以很好地完成这项工作。
  • @Thief - 但我喜欢不得不逃避我的斜线;它使正则表达式语法更加迟钝!耶! ;-)(但是是的,我已经编辑它以使用替代字符)
  • 试过你的例子,但它不起作用(也许我们误解了)。我用更简洁的解释编辑了我的主题;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2018-09-10
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多