如何为“解析”HTML链接创建自己的正则表达式?

时间:2011-05-09 11:23:01

标签: php regex

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

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

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

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

2 个答案:

答案 0 :(得分:2)

对于你的两种情况,你都需要看后面的断言。

  1. \b(?<!")(\w)\b - 只有在"
  2. 之前没有匹配的否定后备才能匹配
  3. (?<=ThisShouldBePresent://)(.*) - 只有在你的字符串前面才能匹配正面的后视。

答案 1 :(得分:1)

  1. 这样的事情:preg_match('/\b[^"]/',$input_string);

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

  2. 这样的事情:preg_match('~(((ThisShouldBePresent)://).+)~');

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

    我也接受了@ ThiefMaster的建议并将分隔符更改为~以避免逃脱//