我用
(?<!value=\")##(.*)##
匹配 ## MyString ## 之类的字符串,其格式不是:
<input type="text" value="##MyString##">
这适用于上述形式,但不适用于:(它仍匹配,不匹配)
<input type="text" value="Here is my ##MyString## coming..">
我试过了:
(?<!value=\").*##(.*)##
没有运气。任何建议都将深表感谢。
编辑:我正在使用PHP preg_match()函数
答案 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="[^>"]*)##(.*)##