正则表达式后观问题

时间:2010-02-05 23:50:36

标签: regex lookbehind

我用

(?<!value=\")##(.*)##

匹配 ## MyString ## 之类的字符串,其格式不是:

<input type="text" value="##MyString##">

这适用于上述形式,但不适用于:(它仍匹配,不匹配)

<input type="text" value="Here is my ##MyString## coming..">

我试过了:

(?<!value=\").*##(.*)##
没有运气。任何建议都将深表感谢。

编辑:我正在使用PHP preg_match()函数

3 个答案:

答案 0 :(得分:4)

这不完美(这就是HTML解析器的用途),但它适用于绝大多数HTML文件:

(^|>)[^<>]*##[^#]*##[^<>]*(<|$)

这个想法很简单。你正在寻找一个不在标签之外的字符串。要在标签之外,与其最接近的前角形支架必须关闭(或者根本没有支架),并且最接近的一个必须打开(或不打开)。这假定在属性值中不使用有角度的括号。

如果您确实关心属性名称是“value”,那么您可以匹配:

value\s*=\s*"([^\"]|\\\")*##[^#]*##([^\"]|\\\")*\"

...然后简单地否定匹配(!preg_match(...))。

答案 1 :(得分:1)

@OP,你可以在没有正则表达式的情况下完成。

$text = '<input type="text" value="   ##MyString##">';
$text = str_replace(" ","",$text);
if (strpos($text,'value="##' ) !==FALSE ){
    $s = explode('value="##',$text);
    $t = explode("##",$s[1]);
    print "$t[0]\n";
}

答案 2 :(得分:0)

至少这是一个起点,它适用于给定的例子。

(?<!<[^>]*value="[^>"]*)##(.*)##