помогите с регулярным выражением - PullRequest
1 голос
/ 20 декабря 2009

возможно ли получить регулярное выражение, которое делает:

  1. найти первое вхождение какое-то слово в строке
  2. вернуть подстроку nr букв до и после вхождения
  3. но если он встречает. (точка) перед числом букв до и после вхождения, он просто вернет подстроку до / после точки.
  4. вернуть целые слова

пример:

«Любой, кто знает, как это сделать. Создайте программу, которая вводит регулярное выражение и выводит строки, удовлетворяющие этому регулярному выражению. И бла бла»

если ключевое слово 'program' и мы поставили n букв в 20, оно вернет 20 букв до и после 'program'. Но поскольку он встречает точку до того, как наберет 20 букв, он на этом остановится.

"Создать программу, которая вводит обычный ..."

Возможно ли это с помощью регулярного выражения? какую функцию php я должен использовать? Есть ли готовый сценарий для этого? Я предполагаю, что это довольно основная необходимость при отображении результатов поиска. Кто-то уже получил функцию для обмена?

Ответы [ 2 ]

1 голос
/ 21 декабря 2009

Вот регулярное выражение Дэва в php:

<?php
  $str = "Anyone who knows how to do this. Create a program that inputs a regular expression and outputs strings that satisfy that regular expression. And bla bla";
  $key = "program";
  $lim = 20;
  $reg = "/([^.]{0,{$lim}})({$key})([^.]{0,{$lim}})/"; // /[^.]{0,20}program[^.]{0,20}/

  $res = preg_match($reg, $str, $matches);
  echo $matches[0];

  print_r($matches); // $matches[1] is the pre-text, and $matches[3] is the post-text

Самое сложное требование # 4: «вернуть целые слова». Один из способов справиться с этим, продолжая использовать вышеупомянутое регулярное выражение, - извлечь больше текста до и после, чем вы действительно хотите (скажем, 40 символов). Затем вы можете preg_split текст до и после на пустом месте, что даст вам два массива слов. Запустите массивы через функцию, которая возвращает вам подмножество массива, где общая длина всех слов меньше вашего предела в 20 ...

0 голосов
/ 20 декабря 2009
[^.]{0,MAXCHARS}wordtofind[^.]{0,MAXCHARS}

Замените MAXCHARS числом, соответствующим максимальному количеству символов, которое вы хотите на каждой стороне.

Шаблон [^.] соответствует любому символу, который не является точкой, а квалификатор {0,MAXCHARS} соответствует где угодно от 0 до MAXCHARS этих символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...