Php 大括号内的preg_match(可选存在)有时大括号内的其他内容

Php 大括号内的preg_match(可选存在)有时大括号内的其他内容,php,regex,Php,Regex,我有这样的数据 $data = '<a href="not important"><span class="theclass">data (not important)</span></a> <span class="anotherclass">extra data (October 1, 2010)</span>'; 请不要忘记,有时“10月1日”不存在,但年份始终存在,因此存在或条件。。。。问题是它给了我一个3的数

我有这样的数据

 $data =  '<a href="not important"><span class="theclass">data (not important)</span></a> <span class="anotherclass">extra data (October 1, 2010)</span>';
请不要忘记,有时“10月1日”不存在,但年份始终存在,因此存在或条件。。。。问题是它给了我一个3的数组,在这种情况下,我知道这是因为我对每个条件都有3个大括号,有没有其他更好更干净的方法来实现这一点

第二条件法

   $data =  <a href="not important"><span class="theclass">data</span></a> <span class="theother">data <a href="not importand">data</a>  (2009)</span>
        </h3>
$data=data(2009年)
谢谢大家

使用


在这里,我们要确保前面有一个
字符,然后我们查找在像您的示例一样格式化的日期中看到的文本。这段代码表示允许字母数字字符、文本空格字符、逗号以及数字
([a-Za-z,\d]+)?
+
字符的意思至少是1。它不像
*
+
那样贪婪。我用括号括住它,然后添加一个
字符,使其成为非必需字符。它的工作原理与您的
或语句类似,因为它仍然可以找到年份,但我们没有让PHP做mo重新分析另一个检查。然后我们找到年份(总是4位
{4}
)。然后我们检查以确保它后面跟着一个文本
字符。“回头看”
(?我添加了一个额外的条件,即年份始终存在。请您解释一下您的表达方式。谢谢:)啊,好的,当日期和年份都存在时,这很有效,但不仅仅是年份:)当日期和年份都存在时,您的代码工作得非常完美,但不仅仅是这一年:)preg_match能满足我的条件吗:)太棒了……它有效了……我的第二个条件也是。我理解后面的和前面的,但是你能详细说明一下这个“([A-Za-z,\d]+)?[\d]{4}”请,我知道\d{4}代表4位数字,所以你可以省略它。但是剩下的有点让人困惑:)干杯m8cool我只理解了最后一点,在这个“[a-Za-z,\d]+”中,“,”和“\d”表示“包括逗号和数字”吗?最后的“+”号表示配偶。谢谢:)不要使用正则表达式来解析HTML。使用适当的HTML解析模块。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的PHP模块正确解析HTML的示例,请参见。即使我使用了xpath dom,我仍然需要一个类ref,通过它可以获取数据。这和我在preg_match上做的差不多,在下面的preg之前,所以我不明白为什么人们反对它…是因为其他人更轻量级?
   $data =  <a href="not important"><span class="theclass">data</span></a> <span class="theother">data <a href="not importand">data</a>  (2009)</span>
        </h3>
$data =  '<a href="not important">
   <span class="theclass">data (not important)</span></a>
   <span class="anotherclass">extra data (October 1, 2010)</span>
   <span class="anotherclass">extra data (2011)</span>';
$pattern = '!(?<=\()([A-Za-z ,\d]+)?[\d]{4}(?=\))!';
$res = preg_match_all($pattern,$data,$myDate);

print_r($myDate[0]);
Array
(
    [0] => October 1, 2010
    [1] => 2011
)
$res = preg_match($pattern,$data,$myDate);

echo($myDate[0]);
October 1, 2010
$pattern = '!(?<=\()[A-Za-z ,\d]*[\d]{4}(?=\))!';