我的正则表达式不起作用

时间:2013-02-22 12:55:28

标签: php regex

我只是不明白,似乎正则表达式恨我。

我需要从HTML代码中获得一个简单的模式

我需要标签之间的单词。

出于某种原因,在javascript在线正则表达式工具中,这有效:

$pattern = '/<image>(.*?)<\/image>/';

我正在搜索的一个例子是:

<p>Die exakten Maße für die Gruppenmontage mit Bobilink sehen sie hier:</p>\r\n</td>\r\n<td>\r\n<p><image>classic_b montage link.jpg</image></p>

但我只得到Array()的输出我完整的PHP代码:

$zeilen = file('j25.sql'); 
$pattern = '/<image>(.*?)<\/image>/';
foreach ($zeilen as $zeile) {
    preg_match($pattern, $zeile, $matches);
}
echo '<h1>Matches</h1>';
print_r($matches); 

请帮助我,如果我没有准备就绪,这将毁了整个周末。错误在哪里?

非常感谢你

5 个答案:

答案 0 :(得分:1)

如果您只想要标签之间的内容,它将存储在$ matches [1]中。 在您的代码中,$ matches会在您分析的每一行中被删除。要获得结果数组,您应该使用另一个变量:

$results = array();
foreach ($zeilen as $zeile) {
    if (preg_match($pattern, $zeile, $matches)) {
        $results[] = $matches[1];
    }
}
print_r($results); 

在你的表达中,你可以替换“*?”用“+”(意思是一个或多个)

答案 1 :(得分:0)

问题不在于正则表达式......这有效:

<?php 
$zeile = "<p>Die exakten Maße für die Gruppenmontage mit Bobilink sehen sie hier:</p>\r\n</td>\r\n<td>\r\n<p><image>classic_b montage link.jpg</image></p>";

// $zeilen = file('j25.sql'); 
$pattern = '/<image>(.*?)<\/image>/';
// foreach ($zeilen as $zeile) {
    preg_match($pattern, $zeile, $matches);
// }
echo '<h1>Matches</h1>';
print_r($matches); 

 ?>

产生这个输出......

<h1>Matches</h1>Array
(
    [0] => <image>classic_b montage link.jpg</image>
    [1] => classic_b montage link.jpg
)

答案 2 :(得分:0)

您在测试php文件中测试代码对我有用...

$testStr = '<p>Die exakten Maße für die Gruppenmontage mit Bobilink sehen sie hier:</p>\r\n</td>\r\n<td>\r\n<p><image>classic_b montage link.jpg</image></p>';
$pattern = '/<image>(.*?)<\/image>/';
preg_match($pattern, $testStr, $matches);
print_r($matches); 

//outputs:   Array ( [0] => classic_b montage link.jpg [1] => classic_b montage link.jpg )

您可以发布数据文件的内容吗?

答案 3 :(得分:0)

确保文件具有正确的服务器权限,以便PHP可以读取内容。

答案 4 :(得分:0)

你的错误是$matches只会在文件的最后一行包含匹​​配,因为它的值会在循环的每次迭代中重新定义。您可以将每行中的捕获组匹配matches[1]添加到另一个阵列,如在Romains的答案中,或使用以下内容:

$zeilen = file_get_contents('j25.sql'); 
$pattern = '/<image>(.*?)<\/image>/';
preg_match_all($pattern, $zeilen, $matches);

echo '<h1>Matches</h1>';
print_r($matches[1]);