我真的被这个程序困住了...... 我正在学习如何编程,而我现在正在使用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){
但我不知道接下来该做什么。 你有什么想法?你能帮忙吗?
提前谢谢你:)
答案 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
或者,你可以随时使用正则表达式,正如另一个提到的那样,但这是另一个故事。