Я использую
(?<!value=\")##(.*)##
к строке совпадения как ##MyString## это не в форме:
<input type="text" value="##MyString##">
Это работает на вышеупомянутую форму, но не на это: (Это все еще соответствует, не должен соответствовать),
<input type="text" value="Here is my ##MyString## coming..">
Я попробовал:
(?<!value=\").*##(.*)##
без удачи. Любые предложения будут глубоко цениться.
Править: Я использую PHP preg_match () функция
Это не идеально (для этого предназначены парсеры HTML), но он будет работать для подавляющего большинства файлов HTML:
(^|>)[^<>]*##[^#]*##[^<>]*(<|$)
Идея проста. Вы ищете строку вне тегов. Чтобы находиться за пределами тегов, ближайшая к нему предшествующая угловая скобка должна быть закрывающейся (или отсутствовать вообще), а ближайшая следующая должна открываться (или не открываться). Это предполагает, что угловые скобки не используются в значениях атрибутов.
Если вы действительно хотите, чтобы имя атрибута было «значением», то вы можете сопоставить:
value\s*=\s*"([^\"]|\\\")*##[^#]*##([^\"]|\\\")*\"
... а затем просто отрицать совпадение (! Preg_match (...)
).
@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";
}
по крайней мере, это отправная точка, она работает для данных примеров.
(?<!<[^>]*value="[^>"]*)##(.*)##