Php 完全排除Woocommerce中装运的所有邮政信箱变更

Php 完全排除Woocommerce中装运的所有邮政信箱变更,php,woocommerce,Php,Woocommerce,我在woocommerce中使用此功能阻止人们输入pobox地址。它工作得很好,但它没有考虑输入其他变体(如“po”或“box”)的人 我如何确保也阻止此操作 谢谢 /** * Prevent PO box shipping */ add_action('woocommerce_after_checkout_validation', 'deny_pobox_postcode'); function deny_pobox_postcode( $posted ) { global $woo

我在woocommerce中使用此功能阻止人们输入pobox地址。它工作得很好,但它没有考虑输入其他变体(如“po”或“box”)的人

我如何确保也阻止此操作

谢谢

/**
 * Prevent PO box shipping
 */
add_action('woocommerce_after_checkout_validation', 'deny_pobox_postcode');

function deny_pobox_postcode( $posted ) {
  global $woocommerce;

  $address  = ( isset( $posted['shipping_address_1'] ) ) ? $posted['shipping_address_1'] : $posted['billing_address_1'];
  $postcode = ( isset( $posted['shipping_postcode'] ) ) ? $posted['shipping_postcode'] : $posted['billing_postcode'];

  $replace  = array(" ", ".", ",");
  $address  = strtolower( str_replace( $replace, '', $address ) );
  $postcode = strtolower( str_replace( $replace, '', $postcode ) );

  if ( strstr( $address, 'pobox' ) || strstr( $postcode, 'box' ) ) {
    wc_add_notice( sprintf( __( "Sorry, we cannot ship to PO BOX addresses.") ) ,'error' );
  }


}

用于查找邮政信箱的正则表达式:
/(邮政信箱)|邮政信箱/gmi

解释:

  • /(PO | BOX)
    字符串包含PO或BOX
  • |
  • PO?\s?BOX
    PO后跟可选空格,后跟BOX
  • /gmi
    全局大小写,多行,不区分大小写
在代码中执行正则表达式:

preg_match('/(PO|BOX)|PO?\s?BOX/gmi', $postcode, $matches);
if ($matches) {
    // you found a match! handle logic here
}
显然,使用此正则表达式时要小心,因为许多其他邮政编码可能合法地包含“PO”或“BOX”,所以请根据您的需要和研究调整此正则表达式


你可以在这里查看:

好的,我在下面更新了我的函数

唯一不好的一面是正则表达式没有阻止“po 123”


/**
 * Prevent PO box shipping
 */
add_action('woocommerce_after_checkout_validation', 'deny_pobox_postcode');

function deny_pobox_postcode( $posted ) {
  global $woocommerce;

  $address  = ( isset( $posted['shipping_address_1'] ) ) ? $posted['shipping_address_1'] : $posted['billing_address_1'];
  $postcode = ( isset( $posted['shipping_postcode'] ) ) ? $posted['shipping_postcode'] : $posted['billing_postcode'];

  $replace  = array(" ", ".", ",");
  $address  = strtolower( str_replace( $replace, '', $address ) );
  $postcode = strtolower( str_replace( $replace, '', $postcode ) );

preg_match('/(?:P(?:ost(?:al)?)?[\.\-\s]*(?:(?:O(?:ffice)?[\.\-\s]*)?B(?:ox|in|\b|\d)|o(?:ffice|\b)(?:[-\s]*\d)|code)|box[-\s\b]*\d)/i', $address, $matches);
if ($matches) {
    wc_add_notice( sprintf( __( "Sorry, we cannot ship to PO BOX addresses.") ) ,'error' );
}

}


如果有人碰巧住在纽约布鲁克林绿点72号博克斯街11222号怎么办?我建议永远不要像这样过滤地址,只是把一个明确的警告放在某个地方,你不能发送到邮箱地址。我同意上面的评论。您可以使用正则表达式来匹配字符串,如pobox、box等。您是对的,我没有想到这一点。OliverBigras Morin发布了一个答案,让我知道你的想法。谢谢你的帮助。gmi是什么意思?我的日志中有一个错误:PHP警告:preg_match():未知修饰符“g”该
g
表示全局,在联机编辑器中检查多行正则表达式时,您可以根据需要尝试将其删除。