2

我是正则表达式的初学者,并且正在我无法安装任何东西的服务器上工作(使用 DOM 方法是否需要安装任何东西?)。

我有一个问题,我目前的知识无法解决。我想从专辑 id 和图像 url 下面的行中提取。字符串(文件)中有更多的行和其他 url 元素,但我需要的专辑 id 和图像 url 都在类似于下面的字符串中:

<a href="http://www.mydomain.com/galeria/thumbnails.php?album=774" target="_blank"><img alt="/" src="http://img255.imageshack.us/img00/000/000001.png" height="133" width="113"></a>

所以在这种情况下我想得到'774'和'http://img255.imageshack.us/img00/000/000001.png'

我见过多个仅从字符串中提取 url 或一个其他元素的示例,但我确实需要将它们保存在一起并将它们存储在数据库的一个记录中。

非常感谢任何帮助!

4

2 回答 2

4

由于您是新手,我将解释您可以使用 PHP 的 HTML 解析器DOMDocument来提取您需要的内容。您不应该使用正则表达式,因为它们在解析 HTML 时天生就容易出错,并且很容易导致许多误报。

首先,假设您有 HTML:

$html = '<a href="http://www.mydomain.com/galeria/thumbnails.php?album=774" target="_blank"><img alt="/" src="http://img255.imageshack.us/img00/000/000001.png" height="133" width="113"></a>';

现在,我们将它加载到 DOMDocument 中:

$doc = new DOMDocument;
$doc->loadHTML( $html);

现在,我们已经加载了 HTML,是时候找到我们需要的元素了。假设您可以<a>在文档中遇到其他标签,因此我们希望找到那些<a>具有直接<img>标签作为子标签的标签。然后,检查以确保我们有正确的节点,我们需要确保我们提取正确的信息。所以,让我们开始吧:

$results = array();

// Loop over all of the <a> tags in the document
foreach( $doc->getElementsByTagName( 'a') as $a) {
    // If there are no children, continue on
    if( !$a->hasChildNodes()) continue;

    // Find the child <img> tag, if it exists
    foreach( $a->childNodes as $child) {
         if( $child->nodeType == XML_ELEMENT_NODE && $child->tagName == 'img') { 
             // Now we have the <a> tag in $a and the <img> tag in $child
             // Get the information we need:
             parse_str( parse_url( $a->getAttribute('href'), PHP_URL_QUERY), $a_params);
             $results[] = array( $a_params['album'], $child->getAttribute('src'));              
         }
    }
}

Aprint_r( $results);现在给我们留下

Array
(
    [0] => Array
        (
            [0] => 774
            [1] => http://img255.imageshack.us/img00/000/000001.png
        )

)

请注意,这省略了基本的错误检查。您可以添加的一件事是在内部foreach循环中,您可以检查以确保成功解析了's属性中的album参数,如下所示:<a>href

if( isset( $a_params['album'])) {
    $results[] = array( $a_params['album'], $child->getAttribute('src'));        
}

我在其中使用的每个函数都可以在PHP 文档中找到。

于 2012-11-19T22:12:42.743 回答
2

如果您已经将其缩小到这一行,那么您可以使用如下的正则表达式:

$matches = array();
preg_match('@.+album=(\d+).+src="([^"]+)@', $yourHtmlLineHere, $matches);

现在如果你

echo $matches[1];
echo " ";
echo $matches[2];

您将获得以下信息:

774 http://img255.imageshack.us/img00/000/000001.png

于 2012-11-19T22:02:30.287 回答