preg_replace输入标记中的特定src属性

时间:2017-07-19 17:11:21

标签: php paypal attributes preg-replace

我有一个PayPal按钮代码,我想使用自己的图像。这是PayPal按钮代码:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"> 
    <input type="hidden" name="cmd" value="_s-xclick"> 
    <input type="hidden" name="hosted_button_id" value="Q8LQ82SNNSBKC"> 
    <input type="image" src="https://www.paypal.com/images/pp-buy-now-btn-bryellow.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!"> 
    <img alt="" border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" width="1" height="1"> 
</form>

...其中包含多个&#39;输入&#39;标签,我想替换&#39; src&#39;输入(图像类型)。我已尽最大努力完成这项工作:

$paypal_button_code2 = preg_replace('/<input[type="image"]\ [^>]+src="([^"]+)"/', $newimageurl, $paypal_button_code);

但这不起作用。

有人可以指出我正确的方向(使用正确的代码,或通过正则表达式的帮助页面轻松的方式!!)

非常感谢!

4 个答案:

答案 0 :(得分:2)

使用html的方法是DOMDocument,而不是正则表达式:

$html = '<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="hosted_button_id" value="Q8LQ82SNNSBKC"> <input type="image" src="https://www.paypal.com/images/pp-buy-now-btn-bryellow.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!"> <img alt="" border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" width="1" height="1"> </form>';

$dom = new DOMDocument;
$dom->loadHTML('<div id="root">' . $html . '</div>');
$root = $dom->getElementById('root');
$xp = new DOMXPath($dom);

$nodeList = $xp->query('//form[@action="https://www.paypal.com/cgi-bin/webscr"][1]/input[@type="image"]/@src');

if ( $nodeList ) {
    $newimageurl = 'path/to/newimage.gif';
    $nodeList->item(0)->nodeValue = $newimageurl;
    $html = '';

    foreach ($root->childNodes as $childNode) {
        $html .= $dom->saveHTML($childNode);
    }
}

echo $html;

XPath查询详情:

//    # anywhere in the DOM tree
form  # a form element
[     # open a predicate (condition on the current element)
    # must have an attribute "action" with the value of this string
    @action="https://www.paypal.com/cgi-bin/webscr"
]
[1] # other predicate: first occurrence of this kind of form
/   # direct child
input
[
    @type="image"
]
/
@src # src attribute

关于'<div id="root">' . $html . '</div>'

DOMDocument::loadHTML加载一个html字符串并构建DOM树。要做到这一点,你需要一个根元素,但由于你处理的是html部分而不是整个html文档,你的字符串可能没有包含在一个独特的元素之间(即整个html文档中的<html>...</html> )。为了避免DOMDocument的自动更正,诀窍在于提供一个假的根元素。编辑DOM树后,您所要做的就是连接根元素的所有子节点。

答案 1 :(得分:1)

你不需要<input[type="image"]

$paypal_button_code2 = preg_replace('/src="([^"]+)/', 'src="'.$newimageurl, $paypal_button_code, 1);

答案 2 :(得分:0)

为什么不这样做:

<input type="image" src="<?php echo $newimageurl;?>" ...>

答案 3 :(得分:0)

我建议您不要像使用HTML一样处理HTML。这真的是错误的方式。

我建议您使用模板框架,一个简单的模板框架,例如smarty - https://www.smarty.net/ - 或者至少是您格式化字符串,例如:

$my_url = "http://whatyouwant";
$whatever_html = <<<EOT
<input type="image" src={%MYCOOKIE%} border="0" name="submit" alt="PayPal – The safer, easier way to pay online!"> <img alt="" border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" width="1" height="1"> </form>
EOT;

$whatever_html = str_replace($whatever_html, $my_url, "{%MYCOOKIE%}");

三重'&lt;&lt;&lt;&lt;'的特殊语法(HEREDOC)允许您放置任何类型的HTML代码,而无需进一步警惕引号。

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc