从字符串中获取标题

时间:2014-07-18 08:23:51

标签: php

我真的被这个程序困住了...... 我正在学习如何编程,而我现在正在使用PHP。 我需要从文章中获取标题。 我已经问过这个问题,而且我还想以多种方式获得文本的第一个标题。例如,如果文字是:

您好

我正在学习如何 写这段代码。

:像这样,所以我得到了“Hello”部分,例如:

    <?php
    $string = "Hello

    I'm learning how
    to write this code."; 
    $str=strstr($string,"\n",true);
    echo $str . "<br />";
    ?> 

然而,文章中可能会有很多标题,其中每一个标题都与上面的空行分开,而且我无法掌握所有这些标题。

这是我试过的:

    <?php
    $string="

    Good text

    Good text is good but I have no idea
    how to code this.

    Another title

    I need to get you,
    but don't know how."
    $get = substr($string, strpos($string, $finda), -1); 
    $finda="\n";
    $getFinal=strstr($get, $finda, true); 
    echo $getFinal; 
    ?>

但这不起作用,因为每行之后都有“\ n”。如何识别那些空白行?我试图找到它们:

    $getRow = explode("\n", $string);
    foreach($getRow as $row){ 
    if(strlen($row) <= 1){

但我不知道接下来该做什么。 你有什么想法?你能帮忙吗?

提前谢谢你:)

2 个答案:

答案 0 :(得分:1)

您可以使用这样的正则表达式:

<?php

$string="
Good text

Good text is good but I have no idea
how to code this.

Another title

I need to get you,
but don't know how.";

preg_match_all('/^\n(.+?)\n\n/m', $string, $matches);

var_dump($matches[1]);

?>

输出:

array(2) {
  [0] =>
  string(9) "Good text"
  [1] =>
  string(13) "Another title"
}

正则表达式

的说明

正则表达式是描述字符串约束的简洁方法。要么检查它是否验证给定的模式或捕获它的一些部分。在这种情况下,我们想要捕获字符串的一些部分(标题)。

'/^\n(.+?)\n\n/m'是用于解决问题的正则表达式。实际表达式在斜杠之间,而前导m是一个选项。它表明我们想要分析多行。

我们留下^\n(.+?)\n\n,可以从左到右阅读。

^表示一行的开头,\n表示“新行”字符。耦合(^\n),它们代表一个空行。

括号表示我们想要捕获的内容。在这种情况下,标题可以是任意数量的任何字符。 .表示任何字符,+表示我们希望该字符出现任意数量(但至少有一个,*可用于包括零发生)。 ?表示我们不想走太远并捕获整个字符串。因此,它将在第一次停止时必须匹配正则表达式的剩余部分。

然后,两个\n代表标题行的结尾和跟随它的空行的结尾。

由于我们使用的是preg_match_all而不是preg_match,因此每次出现的模式都会匹配而不是第一次出现。

正则表达式非常强大,我邀请您learn them further

答案 1 :(得分:0)

在遍历各行时,您可以使用一个变量来存储您当前正在执行的操作。我的意思是你可以有3个状态:processing_text,expecting_title,got_title。

每当你发现$ row ==&#34;&#34; (意思是有一个空行,只包含一个\ n),你将变量设置为expecting_title。如果var == expecting_title,则存储/回显您遇到的下一行并将变量设置为got_title。这样,当您遇到下一个空行时,您不会将变量设置为expecting_title,而是设置为processing_text。

一些伪代码可以帮助您入门:

foreach ($getRow as $row)
    if (state == expecting_title)
        processTitle($row)
        state=got_title
    if ($row == "")
        if (state == processing_text)
            state=expecting_title
        else
            state=processing_text

或者,你可以随时使用正则表达式,正如另一个提到的那样,但这是另一个故事。