2012-06-24 168 views
2

我总是用preg_match,它总是能正常工作, 但今天我试图让两个HTML标签<code: 1>DATA</code>的preg_match返回空数组

之间的内容和我有一个问题,我的代码解释:

function findThis($data){ 
    preg_match_all("/\<code: (.*?)\>(.*?)\<\/code\>/i",$data,$conditions); 
    return $conditions; 
} 

    // plain text 
    // working fine 

    $data1='Some text...Some.. Te<code: 1>This is a php code</code>'; 

    //A text with a new lines 
    // Not working.. 

    $data2='some text.. 
    some.. te 
    <code: 1> 
    This is a php code 
    .. 
    </code> 
    '; 

    print_r(findThis($data1)); 

    // OUTPUT 
    // [0][0] => <code: 1>This is a php code</code> 
    // [1][0] => 1 
    // [2][0] => This is a php code 

    print_r(findThis($data2)); 

    //Outputs nothing! 
+0

的'*'占位符不匹配换行,除非你指定'DOTALL修饰符'/ s'。 – mario

+1

可能的重复[如何匹配正则表达式中多行的任何字符?](http://stackoverflow.com/questions/159118/how-do-i-match-any-character-across-multiple-lines在一个正则表达式) – mario

回答

6

这是因为。 PHP中的字符是的通配符,除了换行符。包括换行符的示例会中断。你想要做的是将“s”标志添加到你的模式的末尾,这会修改该模式。绝对匹配所有内容(包括换行符)。

/\<code: (.*?)\>(.*?)\<\/code\>/is 

在这里看到:http://www.php.net/manual/en/regexp.reference.internal-options.php

+0

非常感谢你肖恩约翰逊,它现在工作正常..但另一个问题,如果我用一个非常长的文本这个函数,我会得到错误?有限制吗?如果是这样,我如何增加限制尺寸? –

+0

然而,限制是分配给PHP的内存。你必须处理一些非常大的数据才能达到这个极限。 –

+0

谢谢肖恩,终于十分钟了,我能够接受你的答案.. –