Переписать кавычки в элементы <q> в WordPress

Я хотел бы переписать символы кавычек в элемент HTML <q>.

❌ "Hello world", George said.

✅ <q>Hello world</q>, George said.

Текст был написан в редакторе WordPress и будет отображаться во внешнем интерфейсе через the_content(). В редакторе все может остаться как есть. Вывод котировок следует изменять только во внешнем интерфейсе.

Мой подход заключается в использовании фильтра для замены кавычек. Однако я не знаю, как отличить открывающие и закрывающие кавычки.

function quote_filter( $content ) {
  $content = preg_replace( ??? );

  return $content;
}

add_filter( 'the_content', 'quote_filter' );

Есть ли у вас идеи, как правильно это решить?

Стоит ли изучать 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
0
84
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я буду использовать цикл for, чередуя открывающий и закрывающий тег при восстановлении строки.

<?php
function quote_filter($content)
{
  $arr = explode('"', $content);
  $brr = [];
  for ($i = 0; $i < count($arr); $i++) {
    $brr[] = $arr[$i];
    if ($i < count($arr) - 1) {
      $brr[] = $i % 2 == 0 ? '<q>' : '</q>';
    }
  }

  return implode("", $brr);
}


$content = 'hello "world" how "are" you?';
echo quote_filter($content);

Кстати, ИИ, вероятно, сказал бы:

<?php
function quote_filter($content)
{
  $content = preg_replace_callback('/"([^"]*)"/', function ($matches) {
    return '<q>' . $matches[1] . '</q>';
  }, $content);

  return $content;
}

Каждая четная кавычка является заключительной.

В функции я проверяю, является ли вторая кавычка и обратная ($секунда = !$секунда), затем использую тернарный оператор, чтобы изменить ее на <p>, если ложно, или </p>, если истинно.

function quote_filter( $content ) {
    $second = false;
    $content = preg_replace_callback(
        "/\"/", 
        function () use (&$second) {
            return ($second = !$second) ? "<p>" : "</p>";
        }, 
        $content
    );  

    return $content;
}

код в песочнице

Вы можете решить свою прямую проблему следующим образом:

$output = "";
for ($index = 0; $index < strlen($input); $index++) {
    $open = true;
    switch ($input[$index]) {
        case $myChar: {
            $output .= ($open ? $prefix : $suffix);
            $open = !$open;
        } break;
        default: $output .= $input[$index];
    }
}

Конечно, вы можете сделать из него функцию и варьировать значения $myChar, $prefix и $suffix, потенциально добавляя стили, используя другие теги или другие разделители по вашему желанию.

Попробуйте это

 function quote_filter( $content ) {
        $inQuote = false;
        $callback = function($matches) use (&$inQuote) {
            if ($inQuote) {
                $inQuote = false;
                return '</q>';
            } else {
                $inQuote = true;
                return '<q>';
            }
        };
            $content = preg_replace_callback('/"/', $callback, $content);
        return $content;
    }
    add_filter( 'the_content', 'quote_filter' );

Я попробовал этот код. Это должно сработать для вас.

<?php

function quote_filter($content)
{
    $is_open = false;
    $content = preg_replace_callback('/"([^"]*)"/', function ($matches) use (&$is_open) {
        if (!$is_open) {
            $is_open = true;
            return '<q>' . $matches[1] . '</q>';
        } else {
            $is_open = false;
            return '<q>' . $matches[1] . '</q>';
        }
    }, $content);

    return $content;
}

add_filter('the_content', 'quote_filter');


Пожалуйста, дайте мне знать, если возникнет еще один вопрос.

Ответ принят как подходящий

Многие ответы здесь пошли в правильном направлении. Однако крючок the_content, который я предложил сам, работает за пределами системы WordPress.

Строка, которую мы получаем в этот момент, уже была изменена CMS. Точнее, он был локализован функцией wptexturize (i18n).

Вместо того, чтобы снова перезаписывать уже локализованную строку с помощью поиска и замены, мы можем просто изменить используемые переменные wptexturize.

function md_filter_curly_double_quotes( $translations, $text, $context, $domain ) {
  if ( 
    'opening curly double quote' === $context && 
    '&#8220;' === $text 
  ) {
    $translations = '<q>';

  } else if ( 
    'closing curly double quote' === $context && 
    '&#8221;' === $text 
  ) {
    $translations = '</q>';
  }

  return $translations;
}

add_filter( 'gettext_with_context', 'md_filter_curly_double_quotes', 888, 4 );

Это решение основано на Gist от Dimadin, в котором фигурные кавычки заменяются шевронами.

Спасибо за вашу поддержку!

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