preg_replace заменяет все

Я хочу заменить некоторые HTML-теги пустой строкой и хочу получить только текст. Ниже приведен пример, который я хочу.

preg_match_all("/<span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">(.*)<\/span>/U", $content, $matches);

Приведенная выше строка возвращает что-то вроде этого.

<span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>

Теперь я хочу получить только целочисленное значение (т. Е. 50). Я попытался следующее утверждение, чтобы удалить теги HTML.

    foreach($matches[0] as $key=>$val) {
        $price = preg_replace( '/<(.*)>/', '', $val);
    }

Но проблема в том, что он заменяет все, и возвращается пустая строка. Он должен вернуть 50, нет нуля. Переменная $price выходного файла должна выглядеть так:

$price = 50

2 ответа

Решение

Попробуйте добавить знак вопроса к своему регулярному выражению

foreach($matches[0] as $key=>$val) {
  $price = preg_replace( '/<(.*?)>/', '', $val);
}

Это будет иметь эффект поиска первого > вместо последнего. Регулярные выражения являются жадными и найдут все, что могут.

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

Если кажется, что соответствует больше, чем ожидалось, используйте ? для не жадного матча. Жадный (.*) будет потреблять как можно больше, делая его не жадным (.*?) предотвратит это.

preg_replace('/<(.*?)>/', '', $val);

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

$content = <<<DATA
<span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>
<span id="priceblock_ourprice" class="a-size-medium a-color-price">40</span>
<span id="foo">30</span>
DATA;

$doc = new DOMDocument();
$doc->loadHTML($content); // Load your HTML content

$xpath = new DOMXPath($doc);
$vals = $xpath->query("//span[@id='priceblock_ourprice']");

foreach ($vals as $val) {
   echo $val->nodeValue . "\n";
}

Выход

50
40
Другие вопросы по тегам