9

我用

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

匹配像 ##MyString## 这样的字符串,但不是以下形式:

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

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

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

我试过:

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

没有运气。任何建议将不胜感激。

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

4

3 回答 3

4

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

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

这个想法很简单。您正在寻找标签之外的字符串。要在标签之外,最靠近它的前面的尖括号必须是闭合的(或者根本没有括号),并且最近的后面的尖括号必须是打开的(或没有)。这假定在属性值中不使用尖括号。

如果您真的关心属性名称是“值”,那么您可以匹配:

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

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

于 2010-02-06T05:14:14.450 回答
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";
}
于 2010-02-06T01:02:58.477 回答
0

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

(?<!<[^>]*value="[^>"]*)##(.*)##
于 2010-02-06T00:07:19.963 回答