我在网络文档中有一系列网址,如下所示:
<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 );
答案 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)
似乎你可能会混淆一个多步骤的任务,从长远来看最终可能会造成更多麻烦。你基本上喜欢做三件事:
在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?。