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

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

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

Я хочу, чтобы preg_match_all вернулся

Array ( [0] => Array ( [0] => Do) [1] => Array ( [0] => знать))

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

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

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

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

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

Есть идеи?

Спасибо

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 ) что ближе к тому, что вы ищете.

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

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

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

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

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

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

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

Это похоже на работу, однако

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

так:

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

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

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

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

[1] => Array
    (
        [0] => Do
        [1] => know
    )
Другие вопросы по тегам