В PHP у меня есть строка: "Последний Новости, заголовки, анализ, фото и видео по Бараку Обама"
Я хочу проанализировать строку и добавить все выделенные жирным шрифтом слова (слова с тегом <b> вокруг него) в массив. В данном случае "новости" и "Обама"
Вот что у меня есть до сих пор, хотя я думаю, что это можно было бы сделать более элегантным/"правильным" способом с регулярными выражениями или чем-то еще.
<?php
$string = "Latest <b>news</b>, headlines, analysis, photos and videos on Barack <b>Obama</b>";
$words = explode(" ", $string);
$boldedWords = array();
foreach($words as $word){
if ( strpos($word, "<b>" ) !== false) {
if (!in_array($word, $boldedWords)){
array_push($boldedWords, $word);
}
}
?>
3 строки это не много лишних шагов 3v4l.org/tuTSj
Это работает нормальноЯ думаю, это лучший способ
preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords);
без foreach
echo $boldedWords[1]
Это не лучший способ. Загляните в парсеры.
Очень близко, когда я пробую это, и print_r($boldedWords) я получаю «Массив ([0] => новости [1] => новости)». Похоже, пропустил "Обаму" и дважды дал "новости"
«Обама» не попадает в массив $boldedWords
о, извините, используйте preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords); var_dump($boldedWords[1]);
$string = "Последние <b>новости</b>, заголовки, анализ, фото и видео о Бараке <b>Обаме</b>"; preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords); var_dump($boldedWords[1]);
Мне потребовалось некоторое время, и тем временем у вас есть более быстрые ответы на ваши вопросы. В моем подходе используется preg_match_all
вместо preg_match
.
Вот демо, чтобы поиграть с входной строкой и шаблоном, если вы хотите продолжить изучение.
<?php
$string = "Latest <b>news</b>, headlines, analysis, photos and videos on Barack <b>Obama</b>";
$o = preg_match_all('/<b>(?<bolded_text>.+?)</b>/', $string, $boldedWords);
//if no errors occured performing the match (in that case $o will contain the number of matches)
if ($o !== false){
//this is the array containing the raw matched text including the <b></b> tags
var_dump($boldedWords[0]);
/*
outputs:
array(2) {
[0]=>
string(11) "<b>news</b>"
[1]=>
string(12) "<b>Obama</b>"
}
*/
//this is the array containing the bolded text but stored with no <b></b>
var_dump($boldedWords[1]);
/*
outputs:
array(2) {
[0]=>
string(4) "news"
[1]=>
string(5) "Obama"
}
*/
}
Парсинг HTML/XML также может работать, но требует много дополнительных шагов, и для моих целей приведенные ниже ответы являются лучшими ответами.