【问题标题】:Get a string between 2 strings/tags in php在php中获取2个字符串/标签之间的字符串
【发布时间】:2015-02-09 19:54:08
【问题描述】:

我正在尝试使用 preg_match 在 2 个字符串之间获取一个字符串

字符串是这样的,这只是一个例子

<source src='http://website.com/384238/dsjfjsd.jpg' type='image/jpg' data-res='43543' lang='English'/>

我想要链接,“data-res=”是一个变化很大的链接:

我正在做这样的事情:

preg_match("<source src='(.*)' type='image/jpg' data-res='43543",$input,$output);

我也试过这种方式

$output = trim(cut_str($input, '<source src='', ' type='image/jpg' data-res='43543'));

我认为问题在于不知道如何表示空格或特殊字符,我还想知道解决这个问题的最佳功能是什么

【问题讨论】:

  • 您只想要具有data-res 属性的&lt;source&gt; 链接吗?还是你想要所有这些?
  • 我想要专门具有“data-res='43543'”的“源”链接,它只是一个匹配项

标签: php string


【解决方案1】:

虽然您可以使用正则表达式来做到这一点。我鼓励你使用DOMDocument

从那里使用getElementByTagName() 获取所有源标签会很简单:

$dom = new DOMDocument;
$dom->loadHTML($html);
$source_tags = $dom->getElementsByTagName('source');
foreach ($source_tags as $source_tag) {
    echo 'Link: ' . $source_tag->attributes->getNamedItem('src')->nodeValue;
}

如果您对带有data-res 属性的source 标签感兴趣,This question 也可能会有所帮助。

【讨论】:

  • 我真的想要一个更简单的通用解决方案来抓取两个随机字符串之间的任何内容我认为“trim(cut_str)”是我发现的最简单的函数,我认为一些撇号或其他字符在字符串中是否弄乱了代码,我不确定
  • 如果你想让它通用,你可以编写一个自定义函数来包装它,但是用DOMDocument解析HTML是一种更好的方式去。
【解决方案2】:

您可以尝试以下代码:

// The Regular Expression filter
$reg_exSRC = "/(src)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

// The text you want to filter for urls
$text = "<source src='http://website.com/384238/dsjfjsd.jpg' type='image/jpg' data-res='43543' lang='English'/>";

// apply expression to the text
preg_match($reg_exSRC, $text, $url);

echo $url[0];

【讨论】:

  • 最好添加一个错误说明以及您“更改”的内容
【解决方案3】:

为什么不这样解析呢?它比 REGEX 更快,更易于使用。

$dom = new DOMDocument;
$dom->loadHTML('<source src="http://website.com/384238/dsjfjsd.jpg" type="image/jpg" data-res="43543" lang="English" />');

//  We read it
$dataSource = $dom->getElementsByTagName('source');

//  We loop on it
$dataRes = FALSE;
foreach($dataSource as $data){
    #   We read the wanted field
    if(($dataAttr = $data->attributes->getNamedItem('data-res')->nodeValue) == "43543"){
        #   We assign it
        $dataRes&= $dataAttr;

        #   Done - We end the loop here
        break;
    }
}

#   We found it ?
if($dataRes !== FALSE){
    #   Yes
    var_dump($dataRes);
} else {
    #   No
    exit('Failed');
}

警告:我没有测试这段代码,但它应该可以工作。

【讨论】:

  • 让它工作了,谢谢,但问题是我想要“src=”,它有专门的 data-res='43543',我用“src”替换了你的“data-res”但是当然我得到第一个随机 因为字符串中有很多
  • 好的,谢谢,但还是漏了一点,我想要具有 data-res='43543' 且位于相同 标签之间的“src”链接值
  • @Ricardo 在底部的 IF 中,读取 $dataRes 并提取 SRC 值:$dataRes-&gt;attributes-&gt;getNamedItem('src')-&gt;nodeValue
  • 非常感谢,以稍微不同的方式在 foreach 中使用多个“ifs”与您编辑之前的方式略有不同
  • @Ricardo 我的荣幸!
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2014-11-07
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多