【问题标题】:better striping method php regex更好的条带化方法 php regex
【发布时间】:2012-09-29 13:47:26
【问题描述】:

请帮助我更有效地剥离以下内容。

a href="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html"

我访问的网站有一些,我只需要这两个时期之间的所有内容:

vFIsdfuIHq4gpAnc

我想使用适用于正则表达式环境的当前格式和编码。请帮我调整我的以下预赛线:

preg_match_all("(./(.*?).html)", $sp, $content); 

非常感谢我在这方面获得的任何帮助,并在此先感谢您!

这是我的完整代码

$dp = "http://www.cnn.com";

$sp = @file_get_contents($dp);
if ($sp === FALSE) {
    echo("<P>Error: unable to read the URL $dp.  Process aborted.</P>");
    exit();
}

preg_match_all("(./(.*?).html)", $sp, $content); 

foreach($content[1] as $surl) {
    $nctid = str_replace("mv/","",$surl);
    $nctid = str_replace("/","",$nctid);
   echo $nctid,'<br /><br /><br />';

以上是我一直在做的事情

【问题讨论】:

标签: php html regex preg-match-all


【解决方案1】:

真的没问题。只是你不想匹配.*?,你想匹配多个不是句号的字符,所以你可以用[^.]+代替。

$sp = 'a href="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html"';
preg_match_all( '/\.([^.]+).html/', $sp, $content );

var_dump( $content[1] );

打印的结果:

array(1) {
  [0]=>
  string(16) "vFIsdfuIHq4gpAnc"
}

这是一个如何循环所有链接的示例:

<?php
$url = 'http://www.cnn.com';

$dom = new DomDocument( );
@$dom->loadHTMLFile( $url );

$links = $dom->getElementsByTagName( 'a' );

foreach( $links as $link ) {
    $href = $link->attributes->getNamedItem( 'href' );
    if( $href !== null ) {
        if( preg_match( '~mv/.*?([^.]+).html~', $href->nodeValue, $matches ) ) {
            echo "Link-id found: " . $matches[1] . "\n";
        }
    }
}

【讨论】:

  • 嗨,Berry,我已经使用了它,但它没有返回我正在寻找的结果。
  • @thevoipman 它对我来说就像一个魅力。我添加了一个小例子。
  • 例如,当我访问 cnn.com 时,我会得到一堆这些:/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html - 我如何在其中实现它你的例子?
  • @thevoipman 啊,所以你的问题不是匹配字符串,而是如何找到所有包含 /mv/ 的链接?
  • 是的,这是正确的,还有之后的一些剥离......抱歉造成混乱。
【解决方案2】:

更简单

$sp="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html";
$regex = '/\.(?P<value>.*)\./';
preg_match_all($regex, $sp, $content);
echo nl2br(print_r($content["value"], 1));

【讨论】:

  • 感谢您的帮助。我已经尝试了您的示例,但它并没有只返回字符串:vFIsdfuIHq4gpAnc - 它给了我一堆我不需要的图片和额外代码。如果我遗漏或未配置您的代码以符合我的需要,请告诉我?
  • 这是整个代码 $sp="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html"; $regex = '/\.(?P.*)\./'; preg_match_all($regex, $sp, $content);回声 nl2br(print_r($content["value"], 1));你也可以尝试打印全数组 echo nl2br(print_r($content,1));
  • 例如,当我访问 cnn.com 时,我会得到一堆这些:/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html - 我如何在其中实现它你的例子?
  • 如果您将 cnn.com 内容视为单个字符串,那么它将无法将您的页面加载为像这样的 dom 元素 $dom = new DOMDocument(); @$dom->loadHTMLFile('cnn.com');然后获取包含数据的特定html标签
  • 这行不通,因为这些 html 链接没有它自己的独特元素供我拉取...它们都是简单的 html 链接,而我要解析/剥离的链接有 /mv /在它面前...
【解决方案3】:

你可以使用explode():

$string = 'a href="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html"';
if(stripos($string, '/mv/')){
    $dots = explode('.', $string);
    echo $dots[(count($dots)-2)];
}

【讨论】:

  • 您好,感谢您的帮助。在 html 中还有其他以 html 结尾的链接。我只是不知道如何去除其中包含 /mv/ 的内容,然后使用您的示例进行测试。请帮忙。
  • 如果你正在循环访问 html 链接,请像我在上面使用 stripos() 所做的那样使用
  • 你好,我有一个学习曲线,因此我不知道你在说什么关于 stripos()... 请你给我一个基于正则表达式代码的完整示例我提供了吗?
  • 你在上面给了我这个:$string = 'a href="/mv/test-1-2-3-4.vFIsdfuIHq4gpAnc.html"';但是其中会有很多包含 /mv/ 的,请帮助我提取仅包含 /mv/ 的那些并获取我需要的字符串。再次感谢!
【解决方案4】:

explode怎么样?

$exploded = explode('.', $sp);
$content = $exploded[1]; // string: "vFIsdfuIHq4gpAnc"

【讨论】:

  • 如果字符串中有两个以上的点,那么 ??
  • 好吧,OP 并不是很清楚字符串中有多少点。无论如何,米海的回答比我的好很多。
  • 当然会有其他的链接有.html,但是如果有mv/的话,应该只有两个点与
  • @KemalFadillah 如果 html 中包含其他链接,您将如何纠正它只会拉取其中包含 mv/ 的 hreft?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多