PHP正则表达式在DOM中查找并替换url属性

目前我有以下代码:</ p>

  // loop 这里
foreach($ doc ['a'] as $ link){
$ href = pq($ link) - &gt; attr('href');

if(preg_match($ url,$ href))
{
//删除匹配的字符串并将自定义网址附加到href attr
}
else
{
//将自定义网址添加到href attr \ n}
}
//结束循环
</ code> </ pre>

基本上我已经取出了小瓶卷曲外部页面。 我需要将自己的自定义URL附加到DOM中的每个href链接。 我需要检查通过正则表达式,如果每个href attr已经有一个基本网址,例如 www.domain.com/MainPage.html/SubPage.html </ code> </ p>

如果是,请替换 www.domain.com </ code>部分 使用我的自定义网址。</ p>

如果没有,则只需将我的自定义网址附加到相对网址即可。 </ p>

我的问题是,我应该使用什么正则表达式语法以及哪些php函数? preg_replace()是否适用于此?</ p>

干杯</ p>
</ div>

展开原文

原文

Currently I have the following code:

    //loop here 
    foreach ($doc['a'] as $link) {
        $href = pq($link)->attr('href');                
        if (preg_match($url,$href))
        {
            //delete matched string and append custom url to href attr
        }       
        else
        {
            //prepend custom url to href attr
        }
    }
    //end loop

Basically I've fetched vial curl an external page. I need to append my own custom URL to each href link in the DOM. I need to check via regex if each href attr already has a base url e.g. www.domain.com/MainPage.html/SubPage.html

If yes, then replace the www.domain.com part with my custom url.

If not, then simply append my custom url to the relative url.

My question is, what regex syntax should I use and which php function? Is preg_replace() the proper function for this?

Cheers

1个回答



您应该尽可能使用内部而不是REGEX,因为这些函数的作者通常会考虑边缘情况(或者读取非常长的URL,用于详细说明所有案例的网址。 对于你的情况,我会使用 parse_url()</ code> 然后 http_build_url()</ code > (注意后一个函数需要PECL HTTP,可以通过以下 http包的文档页面:</ p>

  $ href ='http://www.domain.com/MainPage.html/SubPage.html  '; 
$ parts = parse_url($ href);

if($ parts ['host'] =='www.domain.com'){
$ parts ['host'] ='www.yoursite .com';

$ href = http_build_url($ parts);
}

echo $ href; //'http://www.yoursite.com/MainPage.html/SubPage.html';


nn

使用您的代码进行示例:</ p>

foreach($ doc ['a'] as $ link){
$ urlParts = parse_url(pq($ link) - &gt; attr('href'));

$ urlParts ['host'] ='www.yoursite.com'; //如果有域名,则替换域名,否则会占用您的域名

$ newURL = http_build_url($ urlParts);

pq($ link) - &gt; attr('href',$ newURL) ;
}
</ code> </ pre>
</ div>

展开原文

原文

You should use internals as opposed to REGEX whenever possible, because often the authors of those functions have considered edge cases (or read the REALLY long RFC for URLs that details all of the cases). For you case, I would use parse_url() and then http_build_url() (note that the latter function needs PECL HTTP, which can be installed by following the docs page for the http package):

$href = 'http://www.domain.com/MainPage.html/SubPage.html';
$parts = parse_url($href);

if($parts['host'] == 'www.domain.com') {
    $parts['host'] = 'www.yoursite.com';

    $href = http_build_url($parts);
}

echo $href; // 'http://www.yoursite.com/MainPage.html/SubPage.html';

Example using your code:

foreach ($doc['a'] as $link) {
    $urlParts = parse_url(pq($link)->attr('href'));               

    $urlParts['host'] = 'www.yoursite.com'; // This replaces the domain if there is one, otherwise it prepends your domain

    $newURL = http_build_url($urlParts);

    pq($link)->attr('href', $newURL);
}

doumen6532
doumen6532 我已停止并在mamp中重新启动apache并出现同样的错误。 我以前从未修改过php.ini,但是为了将“extension = http.so”添加到php.ini,我应该包含双引号吗? 我需要添加; 在线之前还是没有? 也许这就是它不起作用的原因
7 年多之前 回复
douman9420
douman9420 您可能需要重启apache。 默认情况下,不会按需加载PHP.ini。
7 年多之前 回复
douhushen3241
douhushen3241 好的,我已经安装了自制软件,设法安装了sudo pecl install pecl_http。 最后我收到此消息安装确定:channel://pecl.php.net/pecl_http-1.7.5配置选项“php_ini”未设置为php.ini位置您应该将“extension = http.so”添加到php .ini我已经将“extension = http.so”添加到我在MAMP中的php.ini文件的顶部,现在我收到此错误,我没有找到解决方案致命错误:调用未定义的函数http_build_url()
7 年多之前 回复
drt41563
drt41563 谢谢你的链接,我现在正在看它。 我只是在谷歌搜索错误消息,我遇到的是人们建议安装自制软件或macports来处理这个问题。 但是我有点担心安装太多第三方工具,这些工具我不熟悉,可能会在以后损坏某些东西。 你使用这些工具吗?
7 年多之前 回复
dsafq2131321
dsafq2131321 recensus.com/blog/technical / ...(总是谷歌错误消息 - 其他人也有可能遇到过这个问题)
7 年多之前 回复
dongshan4878
dongshan4878 它到达Zend Extension Api No:220090625然后找不到autoconf。 请检查您的autoconf安装,然后$ PHP_AUTOCONF环境变量。 然后,重新运行此脚本。 错误:phpize失败了
7 年多之前 回复
duanlisha2335
duanlisha2335 你可能需要使用sudo
7 年多之前 回复
dragon87836215
dragon87836215 我得到无法安装,通道“pecl.php.net”的php_dir不能被当前用户写入
7 年多之前 回复
dtqf81594
dtqf81594 然后你可以在终端使用pecl install pecl_http。
7 年多之前 回复
douhu5837
douhu5837 好的,我刚刚检查了pear.php.net/manual/hu/installation.checking.php是安装了Yea PEAR,但是当我运行上面的完整代码时没有任何反应。 黑屏。 但是当我注释掉$ newURL = http_build_url($ urlParts)时; 它确实有效。 所以我假设P​​ECL还没有包含在PEAR中?
7 年多之前 回复
dongtan6695
dongtan6695 你有签到:pear.php.net/manual/en / ...?
7 年多之前 回复
douqian1975
douqian1975 我正在尝试获取PECL HTTP扩展,并且在php手册网站上它只解释了如何为Windows安装它。 我正在使用mac,我在这里阅读stackoverflow.com/questions/5536195 / ...我应该下载并安装PEAR? 我以前从未安装任何php扩展,你有什么建议我怎样才能在mac上获得PECL HTTP?
7 年多之前 回复
dousuiben8395
dousuiben8395 我只是仔细重新阅读你的答案,哇这就是我真正需要的! 哈哈对不起我的坏事,我必须太累了太多的编码。 我会尽快尝试这个方法,并尽快回来:)
7 年多之前 回复
dongshen7561
dongshen7561 使用它不需要是静态的。 你可以在foreach循环中使用它。 让我重申,我建议不要使用preg_replace()。
7 年多之前 回复
doutou1922
doutou1922 其实我只是想到了什么。 我的自定义网址不是静态的,即它将取决于用户输入并存储在变量中。 preg_replace能够将存储在变量中的url与其他url进行比较,并将匹配的url替换为我自己的url吗?
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问