понимание следующего регулярного выражения - PullRequest
0 голосов
/ 26 августа 2010

Я написал регулярное выражение, но оно не работает, как я ожидаю.Посмотрите, пожалуйста


preg_match_all("/([\.\:]?)(.{0,65}?[^\s]*".preg_quote($word)."[^\s]*.{0,65})/siu",$content,$matched);

[^\s]*".preg_quote($word)."[^\s] //

эта часть соответствует целому слову, если оно содержит ключевое слово, например, оно соответствует keyword если я ищу ключевое слово wor .

.{0,65}?[^\s]*".preg_quote($word)."[^\s]*.{0,65}

здесь я получаю до 65 символов до и после ключевого слова, т.е.я получу

много слов здесь ключевое слово и другие слова здесь


А теперь, в чем проблема.Я пытаюсь сопоставить предложение с начала, если в {65} символах есть какой-либо из символов [.:]

, если у меня есть структура sach - word1 word2 . {меньше 65символ здесь} ключевое слово {другие символы здесь}

я ожидаю, тогда, если я напишу ([\.\:]?)(.{0,65}?[^\s]*".preg_quote($word)."[^\s]*.{0,65})

, это будет соответствовать .{less then 65 character here} keyword {65 characters}

, но это не так.часть [\.\:]? не имеет никакого влияния на регулярные выражения.он соответствует всем {65} символам.

мне нужно сопоставить предложение с самого начала, если начало предложения в пределах 65 символов перед ключевым словом

Ответы [ 2 ]

1 голос
/ 26 августа 2010

[.:]? означает «соответствовать точке (.), двоеточию (:) или ничего»; если следующий символ не является точкой или двоеточием, ([.:]?) ничего не соответствует. Тогда .{0,65} соответствует до 65 единиц, , включая . или :. Я думаю, это то, что вы ищете:

$source='A regular expression (regex or regexp for short) is a special text string for describing a search pattern. You can think of regular expressions as wildcards on steroids.';
$word = 'regular';
preg_match_all('#[^.:]{0,65}\b'.preg_quote($word).'\b.{0,65}#siu', $source, $matches);
print_r($matches);

выход:

Array
(
  [0] => Array
    (
      [0] => A regular expression (regex or regexp for short) is a special text string 
      [1] =>  You can think of regular expressions as wildcards on steroids.
    )

)

(смотреть его в прямом эфире на Ideone )

1 голос
/ 26 августа 2010

Просто замените кулак

.{0,65}

по

[^\.\:]{0,65}

В конце концов, это может выглядеть как

preg_match_all("/([^\.\:]{0,65}?[^\s]*".preg_quote($word)."[^\s]*.{0,65})/siu",$content,$matched);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...