preg_match_all неправильный шаблон

Я пытаюсь выбрать все слова в заранее определенном шаблоне, но это не работает:

$html = "<tooltip>Do</tooltip> you<tooltip>know</tooltip>";

Я хочу, чтобы preg_match_all возвращал

Массив ([0] => Массив ([0] => Сделать) [1] => Массив ([0] => знать))

Используя этот шаблон:

preg_match_all("/<tooltip ?.*>(.*)<\/tooltip>/", $html, $matches);

Вместо этого он возвращается:

Массив ( [0] => Массив ( [0] => Знаете ли вы ) [1] => Массив ( [0] => Знаете ))

Я предполагаю, что мой шаблон неверен, но я не знаю, что?>

Любые идеи?

Спасибо


person ojsglobal    schedule 16.10.2013    source источник


Ответы (4)


Это не совсем так, но регулярное выражение для выбора данных работает нормально. То, как он строит массив, не совсем соответствует тому, что вы ищете. Но с небольшой настройкой, я уверен, вы сможете понять это.

<?php
$html = "<tooltip>Do</tooltip> you<tooltip>know</tooltip>";
preg_match_all("~<tooltip>(.*?)<\/tooltip>~", $html, $matches);
print_r($matches);

foreach($matches[0] as $key => $value) {
    $arr[] = $value;
}

print_r($arr);
?>

Затем $arr возвращает Array ( [0] => Do [1] => know ), что ближе к тому, что вы ищете.

person Karl    schedule 16.10.2013
comment
Что на самом деле делает : (.*?)? - person ojsglobal; 16.10.2013
comment
Точка соответствует каждому символу, кроме разрыва строки, звездочка отмечает повторение, а вопросительный знак является квантификатором, который отмечает предшествующий токен как необязательный. - person Karl; 16.10.2013

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

Это, кажется, работает, однако

<tooltip[^>]*>(.*?)</tooltip>

so:

preg_match_all("/<tooltip[^>]*>(.*?)<\/tooltip>/", $html, $matches);
person Lee    schedule 16.10.2013

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

preg_match_all("/<tooltip>([^<]+)<\/tooltip>/is", $html, $out);

Вы получите желаемый результат, но в $out[1], а не в $out[0].

[1] => Array
    (
        [0] => Do
        [1] => know
    )
person StudioArena    schedule 16.10.2013

проверьте этот SO post, почему мы не используем регулярное выражение для разбора html.

Если вы продолжаете использовать регулярное выражение для извлечения html, используйте предоставленное регулярное выражение @Lee

<tooltip[^>]*>(.*?)</tooltip>

Но это не удастся для (и многих других):

<tooltip attr="some > pretend > stuff">Do</tooltip> you<tooltip>know</tooltip>

Вышеупомянутое может никогда не случиться с вами. В программировании не так много гарантий, но если бы они были, вы бы их не взяли. DomDocument дает вам эту гарантию с html. Ваш звонок

person gwillie    schedule 16.10.2013