【问题标题】:Return the first paragraph that doesn't include certain characters返回不包含某些字符的第一段
【发布时间】:2020-04-27 01:09:09
【问题描述】:

我正在编写一个自定义的 WordPress 摘录函数。

我的帖子的第一段以各种但可预测的方式开始:

  • 有时第一个“段落”是标题(h3、h4)
  • 有时是“署名”(作者:John Smith
  • 有时会有标题和署名
  • 有时第一段是文章的实际文本。

我想要做的是忽略包含标题或署名的段落,并从第一个“正确”段落返回自定义摘录。

有成千上万的条目,所以我们不会很快添加手工制作的摘录。

我开始朝以下方向发展,但我无法完全理解我将在这种情况下使用的逻辑。另外,我觉得可能有更好的(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.
    };
}

【问题讨论】:

    标签: php regex wordpress function grep


    【解决方案1】:

    如果没有示例文本,很难确定,但似乎只要继续您现有的逻辑就可以了。请注意,我会使用正则表达式来匹配 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, '...' );
    }
    

    如果开头可能有超过 2 个可能包含标题或署名的段落,则循环会更有效:

    $para = 0;
    while (strpos($paragraphs[$para], '<h', 0) !== false || preg_match('/\bBy\b/', $paragraphs[$para])) {
        $para++;
    }
    echo wp_trim_words($paragraphs[$para], 40, '...' );
    

    【讨论】:

    • 谢谢——这行得通,但它缺少一些括号!
    • @Tomasch 对错别字感到抱歉,我已经更正了。
    猜你喜欢
    • 2020-05-01
    • 2015-05-02
    • 1970-01-01
    • 2015-06-16
    • 2012-02-18
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多