Регулярное выражение с другой проблемой - PullRequest
9 голосов
/ 06 февраля 2010

Я использую

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

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

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

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

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

Я пытался:

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

без удачи.Будем очень благодарны за любые предложения.

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

Ответы [ 3 ]

4 голосов
/ 06 февраля 2010

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

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

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

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

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

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

1 голос
/ 06 февраля 2010

@ 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";
}
0 голосов
/ 06 февраля 2010

здесь как минимум отправная точка, она работает для приведенных примеров.

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