PHP регулярное выражение не жадный - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно извлечь массив из блока html, в частности, только из инструментов (без инструментов слова и совпадения не должны быть жадными), проблема в том, что блок html принимает две формы, как только это выглядит так:

<p>tools :<br>
 1 Hex Key (or two Hex key)<br>
 1 screww drivers<br>
 1 hammer <br>
 1 drill </p>

и вторая форма выглядит так:

<p>"tools :
 1 Hex Key (or two Hex key)
 1 screww drivers
 1 hammer 
 1 drill "</p>

Я пытаюсь использовать это регулярное выражение, но у меня ничего не получается:

  $tools = "<p>tools :<br>
  1 Hex Key (or two Hex key)<br>
  1 screww drivers<br>
  1 hammer <br>
  1 drill </p>"

 $tools_array = preg_match_all('#<p>tools:([^<>]*<br\s*/?>[^<>]*)+</p>#s', 
 $tools);

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

попробуйте это:

$tools = explode("\n",$tools);

результат:

Array
 (
      [0] => <p>tools :
      [1] =>   1 Hex Key (or two Hex key)<br>
      [2] =>   1 screww drivers<br>
      [3] =>   1 hammer <br>
      [4] =>   1 drill </p>
  )

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

unset($tools[0]);
$tools= array_map(function($val){return strip_tags($val);},$tools);

результат:

 Array
 (
      [1] =>   1 Hex Key (or two Hex key)
      [2] =>   1 screww drivers
      [3] =>   1 hammer 
      [4] =>   1 drill
 )
0 голосов
/ 02 марта 2019

Другой подход .... Без использования RegEX

фрагмент

$tools = "<p>tools :<br>
  1 Hex Key (or two Hex key)<br>
  1 screww drivers<br>
  1 hammer <br>
  1 drill </p>";
  $search = ['<p>','</p>','<br>', 'tools :']; //Add more words to be removed
  $filteredStr = str_replace($search, '',$tools);
  $res = explode(PHP_EOL,$filteredStr);
  array_shift($res); // Removing empty element at the beginning of array
  print_r($res);

Выход

Array
(
    [0] =>   1 Hex Key (or two Hex key)
    [1] =>   1 screww drivers
    [2] =>   1 hammer 
    [3] =>   1 drill 
)

Live Демо

Ссылка
str_replace
взрыв
array_shift

0 голосов
/ 02 марта 2019

Это регулярное выражение должно делать то, что вы хотите:

^(?!\s*<p>tools\s*:)\s*(.*?)(?=\s*(<br|</p|$))

Он ищет строку, которая не начинается с <p>tools:, затем сопоставляет символы (используя не жадное совпадение), пока не увидит одно из следующих значений:<br, </p или конец строки.Совпадение возвращается в группе 1. Мы используем флаг m, чтобы ^ соответствовал началу строки в многострочной строке.

В PHP:

preg_match_all('#^(?!\s*<p>tools\s*:)\s*(.*?)(?=\s*(<br|</p|$))#m', $tools, $tools_array);
print_r($tools_array[1]);

Вывод:

Array (
    [0] => 1 Hex Key (or two Hex key)
    [1] => 1 screww drivers
    [2] => 1 hammer
    [3] => 1 drill 
)

Демонстрация на 3v4l.org

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