Регулярное выражение lookbehind проблема

Я использую

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

к строке совпадения как ##MyString## это не в форме:

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

Это работает на вышеупомянутую форму, но не на это: (Это все еще соответствует, не должен соответствовать),

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

Я попробовал:

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

без удачи. Любые предложения будут глубоко цениться.

Править: Я использую PHP preg_match () функция

9
задан Ali Selcuk 5 February 2010 в 14:36
поделиться

3 ответа

Это не идеально (для этого предназначены парсеры HTML), но он будет работать для подавляющего большинства файлов HTML:

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

Идея проста. Вы ищете строку вне тегов. Чтобы находиться за пределами тегов, ближайшая к нему предшествующая угловая скобка должна быть закрывающейся (или отсутствовать вообще), а ближайшая следующая должна открываться (или не открываться). Это предполагает, что угловые скобки не используются в значениях атрибутов.

Если вы действительно хотите, чтобы имя атрибута было «значением», то вы можете сопоставить:

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

... а затем просто отрицать совпадение (! Preg_match (...) ).

4
ответ дан 3 November 2019 в 07:13
поделиться

@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";
}
1
ответ дан 3 November 2019 в 07:13
поделиться

по крайней мере, это отправная точка, она работает для данных примеров.

(?<!<[^>]*value="[^>"]*)##(.*)##
0
ответ дан 3 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: