PHP正则表达式问题

时间:2009-05-22 14:30:18

标签: php regex

我在网络文档中有一系列网址,如下所示:

<a href="somepage.php?x=some_document.htm">click here</a>

我想要做的是替换粗体:

&lt; a href =“somepage.php?x = some_document.htm ”&gt;点击此处&lt; / a&gt;

..带有某种加密变体(比如说base64_encoding)..这样的事情:

每次匹配

,将其转换为base64_encode(匹配)

备注:

1.短语 href =“somepage.php?x = 将始终位于短语之前。
2.a double-quote()将总是遵循这句话。

我不是一个正则表达的大师 - 但我知道你们中的一些人。有什么简单的方法吗?

更新

我通过使用Chris提交的修改版本来解决这个问题,现在是:

function encrypt_param( $in_matches ) {    
  return   'href="somepage.php?x=' . base64_encode( $in_matches[1] ) . '"';
}

$webdoc = preg_replace_callback( '/href="somepage.php\?x=([^"]+)"/',
                                 'encrypt_param', 
                                 $webdoc );

5 个答案:

答案 0 :(得分:6)

我认为你正在寻找这样的东西:

function doSomething($matches) {
   return base64_encode($matches[1]);
}

preg_replace_callback('/href="somepage.php?x=([^"]+)"/', 'doSomething', $webdoc);

preg_replace答案的工作方式类似。如果你想做更精细的事情,回调将允许你做那个

答案 1 :(得分:2)

我会考虑使用PHP DOM解析器。任何不足都是黑客。 (并不是说黑客总是很糟糕,只要知道简单的正则表达式和DOM解析器之间的区别。)getElementsByTagName()将得到你的&lt; a&gt;标记,getAttribute()将获取您的href属性,并setAttribute()修改。

答案 2 :(得分:1)

preg_replace('/href="somepage.php\?x=([^"]*)"/e', "somepage.php?x='.base64_encode("$1").'"', $url)

(未经测试)。 / e表示您可以在替换字符串中使用表达式

答案 3 :(得分:1)

似乎你可能会混淆一个多步骤的任务,从长远来看最终可能会造成更多麻烦。你基本上喜欢做三件事:

  1. 查找页面上的所有锚标记
  2. 从这些标记中提取href属性中的URL
  3. 从该网址中提取查询字符串中的特定变量
  4. 在PHP中有很多方法可以做到这一点。是的,一种直接的方法是使用正则表达式,但它不太透明。对于这种特殊情况,您的数据非常适合一个非常小的问题,会降低代码的可扩展性,以备将来的应用程序使用。

    我的建议是Source Forge提供的名为SimpleHTMLDom的轻型DOM解析器的实现。使用此解析器,您可以为正在执行的任务编写更清晰的代码。

    foreach ($dom_object->find('a') as $anchor){
        $url = $anchor->href;
        $queryArray = array();
        parse_str(parse_url($url, PHP_URL_QUERY), $queryArray);
        $myVariable = $queryArr['x'];
    }
    

    当然,$ myVariable将是您希望使用该正则表达式获得的值。

答案 4 :(得分:0)

正则表达式在解析HTML方面根本不好(请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex?了解原因)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅Can you provide an example of parsing HTML with your favorite parser?