基本php正则表达式问题

基本php正则表达式问题,php,regex,Php,Regex,我有一个html文件,我想在其中获取这两个标记中的所有文本: <div class="articleTitle"> </div> 我不完全确定如何使用php正则表达式。 (我还知道div中没有html标记,所以嵌套标记没有问题) 更新:当我尝试给出的解决方案时,我得到以下结果:警告:preg_match()[function.preg match]:第29行未知修饰符“d”这会更正确,因为其他解决方案会自行匹配,这可能是不需要的 preg_match('<d

我有一个html文件,我想在其中获取这两个标记中的所有文本:

<div class="articleTitle">
</div> 

我不完全确定如何使用php正则表达式。 (我还知道div中没有html标记,所以嵌套标记没有问题)


更新:当我尝试给出的解决方案时,我得到以下结果:警告:preg_match()[function.preg match]:第29行未知修饰符“d”

这会更正确,因为其他解决方案会自行匹配,这可能是不需要的

preg_match('<div class="articleTitle">(.+?)</div>', $test_string, $matches);
preg_match(“(.+?)”,$test_string,$matches);
preg_match('/(.*?)/i',$source,$matches);
打印(匹配项);
这是RegexBuddy的“解释”:

<div class="articleTitle">(.*?)</div>

Options: case insensitive

Match the characters “<div class="articleTitle">” literally «<div class="articleTitle">»
Match the regular expression below and capture its match into backreference number 1 «(.*?)»
   Match any single character that is not a line break character «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the characters “</div>” literally «</div>»

Created with RegexBuddy
(*)
选项:不区分大小写
按字面上的«匹配字符“”
匹配下面的正则表达式,并将其匹配捕获到反向引用编号1«(.*)中
匹配不是换行符的任何单个字符«。*»
在零次和无限次之间,尽可能少地按需扩展(惰性)«*?»
按字面上的«匹配字符“”
使用RegexBuddy创建
(.*)将捕获从之前到之后的所有内容,并将其放入$matches变量中

我假设HTML将位于$source变量中

我建议你调查一下,它是39.95美元,但它值每一分钱。它可以帮助您使用大多数主要的正则表达式实现构建正则表达式,还可以帮助您学习正则表达式
'/<div class="articleTitle">(.*?)<\/div>/'
一般情况下会起作用;但是,如果您需要考虑div标记中的其他可能属性,那么它会稍微复杂一些。

回答错误

preg_match('#<div\s+[^>]*class="articleTitle"[^>]*>(.*)</\s*div>#ims', $str, $matches);
preg#u match('#]*class=“articletTitle”[^>]*>(.*)#ims',$str,$matches);
  • DIV可以为空,所以像(+)这样的参数是错误的
  • 您应该使用“m”修饰符-内容可以是多行的
  • 应该使用“s”修饰符将点元字符匹配为换行符
  • 只是想知道,如果php中的模式可以有任何分隔符,为什么要转义斜杠呢?在这种情况下,我通常使用#作为分隔符
  • DIV可以具有其他属性和/或空格字符(包括换行符)
  • 对不起,没有时间测试模式是否良好,但它似乎是正确的。这在任何情况下都应该有效


    PS:还有,GONeale,关于贪婪-模式必须是贪婪的,并且它是贪婪的,没有修饰符“U”。

    这将只捕获一个字符,如果有多个字符(甚至是空白),将导致它不匹配,也不会被捕获。该表达式不捕获,但匹配内部文本。由于它是贪婪的,它可能会匹配错误的结束标记。@raj不,正如我在评论中所说,这将只捕获一个字符,文本中不能有任何其他字符。我想问是否有必要使它贪婪。@Unkwntech实际上,它将匹配0到无限个字符,无论如何,这可能是错误的。我们都应该使用“+?”刚刚修复了我的preg_匹配,我缺少了/s和不区分大小写的标志。当我尝试获得以下信息时:警告:preg_匹配()[function.preg match]:第29行未知修饰符“d”在“”中转义正斜杠,因此宁愿编写“”。感谢Torok,我没有让代码滑过去,如果您明确要求标记之间的匹配,我将更新应答,将(.*)更改为(+++),因为这将需要1+个匹配项。该表达式不捕获,但只匹配其中的文本。是的,我错过了-添加()以匹配。我只是想给出一个基本的想法,在答案中还有其他更好(更难解析)的例子。再看一次模式,注意到(++?)必须起作用,但是当它们在总结中等于“*”时,为什么要使用两个量词呢?或者我不知道一些事情,它们以不同的方式工作。。。?PS:谢谢,GONeale,但为什么是挑战者?
    preg_match('#<div\s+[^>]*class="articleTitle"[^>]*>(.*)</\s*div>#ims', $str, $matches);