Получить слова, заключенные в теги <b> из строки, используя PHP

В 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);
       }
   }

?>

Парсинг HTML/XML также может работать, но требует много дополнительных шагов, и для моих целей приведенные ниже ответы являются лучшими ответами.

Sparky Johnson 09.04.2022 02:18

3 строки это не много лишних шагов 3v4l.org/tuTSj

Lawrence Cherone 09.04.2022 02:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это работает нормальноЯ думаю, это лучший способ

preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords);

без foreach

echo $boldedWords[1]

Это не лучший способ. Загляните в парсеры.

user3783243 09.04.2022 02:00

Очень близко, когда я пробую это, и print_r($boldedWords) я получаю «Массив ([0] => новости [1] => новости)». Похоже, пропустил "Обаму" и дважды дал "новости"

Sparky Johnson 09.04.2022 02:02

«Обама» не попадает в массив $boldedWords

Sparky Johnson 09.04.2022 02:06

о, извините, используйте preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords); var_dump($boldedWords[1]);

Gev99 09.04.2022 02:07

$string = "Последние <b>новости</b>, заголовки, анализ, фото и видео о Бараке <b>Обаме</b>"; preg_match_all('/<b>(.*?)</b>/s', $string, $boldedWords); var_dump($boldedWords[1]);

Gev99 09.04.2022 02:09
Ответ принят как подходящий

Мне потребовалось некоторое время, и тем временем у вас есть более быстрые ответы на ваши вопросы. В моем подходе используется 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"
    }
    */
}

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