Вернуть первый абзац, который не содержит определенные символы - PullRequest
1 голос
/ 27 апреля 2020

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

Первые абзацы моих сообщений начинаются различными, но предсказуемыми способами:

  • Иногда первый «абзац» заголовок (h3, h4)
  • Иногда это «подпись» ( Джон Смит )
  • Иногда есть заголовок И подпись
  • И иногда первый абзац - это фактический текст статьи.

Что я хочу сделать, так это игнорировать абзацы, содержащие заголовки или подстрочные знаки, и возвращать пользовательский отрывок из первого «правильного» абзаца.

Есть тысячи записей, поэтому мы не собираемся добавлять выдержки ручной работы в ближайшее время.

Я начал идти в следующем направлении, но я не могу полностью сосредоточиться на логике c, которую я бы использовал в этом сценарии. Кроме того, я чувствую, что, вероятно, есть лучший (GREP?) Способ сделать это.

Есть предложения?

function get_first_ctarticle_paragraph()
{
    global $post;
    $str = wpautop(get_the_content());


    //split content to first paragraph and the rest
    $paragraphs = explode('</p>', $str);

    //extract the first paragraph
    $first_paragraph = $paragraphs[0];
    $second_paragraph = $paragraphs[1];
    $third_paragraph = $paragraphs[2];
    if ((strpos($first_paragraph, '<h', 0) === false) && (strpos($first_paragraph, 'By', 0) === false) && (strpos($second_paragraph, 'By', 0) === false)) {
        echo wp_trim_words( $first_paragraph, 40, '...' );
    } elseif ((strpos($first_paragraph, '<h', 0) === false) && (strpos($first_paragraph, 'By', 0) === false) && (strpos($second_paragraph, 'By', 0) === false)) {
      // etc.
    };
}

1 Ответ

2 голосов
/ 27 апреля 2020

Без примера текста трудно быть уверенным, но кажется, что просто продолжение существующей логики c должно работать. Обратите внимание, что я бы использовал регулярное выражение для сопоставления By, чтобы убедиться, что оно не соответствует что-то вроде Bye Bye:

if (strpos($first_paragraph, '<h', 0) === false && !preg_match('/\bBy\b/', $first_paragraph)) {
    // no header or byline in first paragraph
    echo wp_trim_words($first_paragraph, 40, '...' );
} 
elseif (strpos($second_paragraph, '<h', 0) === false && !preg_match('/\bBy\b/', $second_paragraph)) {
    // no header or byline in second paragraph
    echo wp_trim_words($second_paragraph, 40, '...' );
}
else {
    // header or byline in first and second paragraphs
    echo wp_trim_words($third_paragraph, 40, '...' );
}

Если в начале было потенциально более двух абзацев, которые могли бы содержать заголовок или byline, al oop будет более эффективным:

$para = 0;
while (strpos($paragraphs[$para], '<h', 0) !== false || preg_match('/\bBy\b/', $paragraphs[$para])) {
    $para++;
}
echo wp_trim_words($paragraphs[$para], 40, '...' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...