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