Я хотел бы переписать символы кавычек в элемент 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' );
Есть ли у вас идеи, как правильно это решить?
Я буду использовать цикл 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 &&
'“' === $text
) {
$translations = '<q>';
} else if (
'closing curly double quote' === $context &&
'”' === $text
) {
$translations = '</q>';
}
return $translations;
}
add_filter( 'gettext_with_context', 'md_filter_curly_double_quotes', 888, 4 );
Это решение основано на Gist от Dimadin, в котором фигурные кавычки заменяются шевронами.
Спасибо за вашу поддержку!