URL 中的与号通过 PHP explode() 读作分号


ampersands in url read as semicolon by php explode()

我想允许我的用户在单个字段中创建 url 链接和标签,例如:

立即注册;www.abc123.com

或者只是

www.abc123.com

我的代码如下所示:

$cta_array = explode(";",  $field ) ;
if( count( $cta_array ) > 1 ){
  $cta = '<a href="'.esc_url( $cta_array[1] ).'" class="button '.$color.'">'.esc_html( $cta_array[0] ).'</a>';
}
else{
  $cta = '<a href="'.esc_url( $field ).'" class="button '.$color.'">Select</a>';
}
return $cta;

唯一的问题是,如果他们输入的 url 有带有 & 符号的查询字符串,则 explode(( 函数将 & 符号视为分号 ,因此如果它们输入

立即预订;http://www.abc123.com/scripts/WebObjects.dll/AAAOnline?association=CAA&club=272

$cta_array 变量返回以下内容:

Array

( [0] => 立即预订 [1] => http://www.aaa.com/scripts/WebObjects.dll/AAAOnline?association=CAA&amp; [2] =>俱乐部=272)

我认为它将"&"转换为&amp;并且分号用作分隔符,但我不确定如何解决它。

我在爆炸前用 & 替换了&amp;

$cta_array = explode( ';', str_replace( '&amp;', '&', $cta_array[0]) );

这解决了问题。

要求用户使用其他分隔符,如逗号。或者以编程方式更改分隔符。

$cta_array = explode(“|”,  str_replace(‘;’,’|’,$field));
不仅仅是

替换&amp;更完整的解决方案是解码所有 html 特殊字符

$cta_array = explode(';', htmlspecialchars_decode($field));