Основы регулярных выражений: захват текста между двумя константами - PullRequest
2 голосов
/ 25 февраля 2009

Застрял в (довольно простой) проблеме регулярных выражений в PHP.

В этом беспорядке скрыт этот раздел:

  <tr>
        <td id="descriptionArea">
            Customer request to remove "Intro - 01/13/09" video clip.
            <br/>
        </td>
    </tr>

Я хочу все, что между:

descriptionArea">

... и ...

</td>

Друг предложил:

$pattern = '<td="descriptionArea">\s*(.*?)\s*<';
$clean = preg_replace("'[\n\r\s\t]'","",$text); // to rid of line breaks
preg_match($pattern, $clean, $matches);
print_r($matches);

Но я получаю следующую ошибку:

Warning: preg_match() [function.preg-match]: Unknown modifier 'q'

Полагаю, второй вопрос - является ли preg_match правильной функцией PHP для этого. Должен ли я использовать Ereg вместо этого? Спасибо за вашу помощь.

Ответы [ 6 ]

4 голосов
/ 25 февраля 2009

При использовании функций preg_* первый символ или шаблон рассматривается как разделитель:

Выражение должно быть заключено в разделители, например, косая черта (/). В качестве разделителя можно использовать любой символ, если он не является буквенно-цифровым или обратным слешем (\). Если в самом выражении должен использоваться символ-разделитель, он должен быть экранирован обратной косой чертой. Начиная с PHP 4.0.4, вы также можете использовать Perl-style (), {}, [] и <> соответствующие разделители.
- Регулярные выражения (совместимые с Perl) - Введение

Так что вам не нужно бежать или заменять символы &, как говорили другие. Вместо этого используйте правильные разделители и экранируйте эти символы внутри выражения:

'/&lt;td id=&quot;descriptionArea&quot;&gt;(.*?)&lt;\/td&gt;/'
2 голосов
/ 25 февраля 2009

Вы захотите выйти из «&», как говорит Вомблтон, а также заключить свой шаблон в прямую косую черту, как $ pattern = "/ pattern /";

Приведенный ниже код возвращает массив с некрасивым содержимым, но, по крайней мере, возвращает совпадение .. :)

$description = " &lt;tr&gt;
        &lt;td id=&quot;descriptionArea&quot;&gt;
            Customer request to remove &quot;Intro - 01/13/09&quot; video clip.
            &lt;br/&gt;
        &lt;/td&gt;
    &lt;/tr&gt;";

$pattern = "/&lt;td.*[&]quot;descriptionArea[&]quot;[&]gt;\s*(.*?)\s*.*?lt/";
$clean = preg_replace("'[\n\r\s\t]'","",$description); // to rid of line breaks

preg_match($pattern, $clean, $matches);
var_dump($matches);

EDIT

Вот более приятная версия. Избавьтесь от всей кодировки HTML, чтобы вы могли использовать стандартное регулярное выражение HTML-разбора:

$pattern = '/<.*?id="descriptionArea">(.*?)<\/td>/';
$clean = preg_replace("'[\n\r\t]'","",htmlspecialchars_decode($description)); 
preg_match($pattern, $clean, $matches);
1 голос
/ 25 февраля 2009

Если вы хотите получить текст между двумя константами , не будет ли проще использовать хорошие старые строки?

EDIT

, например

$string = 'text to be >searched< within';
$const1 = '>';
$const2 = '<';
$start = strpos($string, $const1);
$end = strpos($string, $const2, $start + strlen($const1));
$result = substr($string, $start, $end - $start);

Я не запускал его, поэтому он может содержать ошибки, но вы должны понять.

1 голос
/ 25 февраля 2009

Я подозреваю, что это интерпретирует амперсанды как какие-то управляющие символы. Однако я не могу найти ссылку для поддержки этого.

Попробуйте заменить все экземпляры & на [&].

0 голосов
/ 25 февраля 2009

Конкретная ошибка, которую вы получаете, связана с функциями preg_ *, использующими первый символ шаблона в качестве разделителя (в данном случае «&»), и все, что происходит после второго появления разделителя в качестве модификаторов (например, «i» для нечувствительности к регистру.)

В этом случае он думает, что вы ищете lt;td= и вам нужны модификаторы quot;descriptionArea&quot;&gt;\s*(.*?)\s*&lt;. Первый модификатор "q" не имеет смысла, и он освобождает от ответственности.

0 голосов
/ 25 февраля 2009

Что вы использовали для $ pattern?

$pattern = '(?s:descriptionArea&quot;&gt;(.*)&lt;/td&gt;)';

Я не знаю PHP, но кажется, что RegEx работает в Regular Expression Designer, когда я тестировал его. Опция (? S :) - «Одиночная линия».

Mark

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