Невозможно использовать preg_replace в большой строке

Я пытаюсь избавиться от какого-то слова внутри тега <note>. У меня довольно длинная струна

string(4687) "~~PB~~ {{:en:iot-open:remotelab:logotyp_1_.png?200|}} <note>testtest</note> ====== RoofTop Thermo Laboratory - intelligent house and heating management ====== The laboratory is located at nowhere, xxx, xxxxx on the roof of bu...... => сброшенный результат

Проблема в том, что он не удаляет эту строку testtest между тегом note.

Я пытаюсь использовать эту функцию, которую нашел в руководстве strip_tags.

      function strip_tags_content($text, $tags = '', $invert = FALSE) {

  preg_match_all('/<(.+?)[\s]*/?[\s]*>/si', trim($tags), $tags);
  $tags = array_unique($tags[1]);

  if (is_array($tags) AND count($tags) > 0) {
    if ($invert == FALSE) {
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
    }
    else {
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
    }
  }
  elseif ($invert == FALSE) {
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
  }
  return $text;
}

Вот мой полный код

foreach ($data as $line)
        {
            // Find list tag
            $posi = strpos($line, "* ");

            // No list ?
            if ($posi === false) {
                continue;
            }

            // Check indent
            if (($posi % 2) != 0){
                //echo "<li>Invalid indentation in TOC</li>\n";
            }

            // Calculate indent
            $indent = ($posi - 2) / 2;
            // Search for header
            $posh = strpos($line, "]]");

            // No header ?
            if ($posh === false) {
                continue;
            }
            // Extract file path
            $page_path = substr($line, $posi + 4, $posh - $posi - 4);
            $file_path = str_replace(":", "/", $page_path);
            $file_path = $this->getConf("homelab_datapages_folder").$file_path.".txt";
      $indent2 = 0;


            // Page file exists ?
            if (file_exists($file_path))
            {
                // Open file
                $page_content = htmlspecialchars(file_get_contents($file_path));
        $page_content = $this->strip_tags_content($page_content,'note',TRUE);
        $page_cont = strip_tags(html_entity_decode($page_content));
                // Shorten header
                $book_content .= $this->shorten_header($page_content, $indent, $indent2)."\n";

        var_dump($book_content);
        //$book_content .=
      }
            else
            {
                $book_content .= "---\n MISSING PAGE ---\n";
            }

            // Display page
            //echo "    <li>".$page_path." (".$indent.")</li>\n";
        }

В чем может быть проблема?

Моя строка слишком длинная для использования preg_replase или я здесь ошибаюсь?

Если я правильно читаю, ваша строка имеет длину 4687 байт, это не слишком много для preg_replace(). Итак, очевидно, что что-то еще не так. У вас есть strip_tags_content($page_content,'note',TRUE), тогда как, если я буду следовать приведенным примерам, он должен читать strip_tags_content($page_content,'<note>',TRUE). Я абсолютно не уверен, что это сработает, когда вы это сделаете, поэтому это комментарий, а не ответ.

KIKO Software 13.03.2018 15:03

попытался использовать тег <>, но безрезультатно

Godhaze 13.03.2018 15:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
2
164
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда ты звонишь

$this->strip_tags_content($page_content,'note',TRUE);

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

Вызов функции:

$this->strip_tags_content($page_content,'<note>',TRUE);
//                                       ^____^

Я пробовал, но безрезультатно. Он будет работать, если я создам новую переменную, например $ test = "test test <note> TEST </note>" result => test test

Godhaze 14.03.2018 12:18

@Godhaze: Конечно, вам нужно назначить новую переменную, ваша функция не работает.

Toto 14.03.2018 12:34

Что вы имеете в виду, я просто изменил код следующим образом: $ test = "test TEST <note> not TEST </note>"; // $ page_content = htmlspecialchars (file_get_contents ($ file_path)); $ page_content1 = $ this-> strip_tags_content ($ test, '<note>', ИСТИНА); // $ page_cont = strip_tags (html_entity_decode ($ page_content)); // Уменьшить заголовок // $ book_content. = $ This-> correten_header ($ page_cont, $ indent, $ indent2). "\ N"; var_dump ($ page_content1);

Godhaze 14.03.2018 12:40

@Godhaze: Извини, но я тебя не понимаю. Если вы вызываете функцию с параметром <note> вместо note, она отлично работает с приведенным вами образцом текста. Вы должны добавить несколько строк отладки в свой код, чтобы увидеть, где он не работает.

Toto 14.03.2018 13:11
Ответ принят как подходящий

У меня это работает.

Проблема была в функции htmlspecialchars().

$page_content = htmlspecialchars(file_get_contents($file_path));

к

$page_content = file_get_contents($file_path);

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