我有以下疑问,由 SO 提供:
SELECT field_website_value FROM field_data_field_website WHERE field_website_value NOT REGEXP('^(https?://|www\\.)[\.A-Za-z0-9\-]+\\.[a-zA-Z]{2,4}(/\S*)?') AND field_website_value!=''
当直接在 MySQL 客户端中执行此查询时,它可以工作(显示与模式不匹配的值)。
但是,当将其放入 Drupal 中时,它停止工作,它只返回非空的行。
$query = "SELECT field_website_value FROM field_data_field_website WHERE field_website_value NOT REGEXP('^(https?://|www\\.)[\.A-Za-z0-9\-]+\\.[a-zA-Z]{2,4}(/\S*)?') AND field_website_value!=''";
$res = db_query($query)->fetchAll();
echo count($res);
echo "<pre>";print_r($res);die();
有什么方法可以在 Drupal 中使用正则表达式吗?
注意:获取所有行并在 PHP 中应用正则表达式不是一个选项。
我不是 Drupal 专家,但我敢打赌 db_query 函数正在执行 mysql_real_escape_string() 调用,这会弄乱正则表达式,是否还有其他可以传递但不会执行此操作的函数?
实际上是 {} 括号导致了问题,您需要将数据作为变量传递,
$query = "SELECT field_website_value FROM field_data_field_website WHERE field_website_value NOT REGEXP('%s') AND field_website_value!=''";
$regexp = '^(https?://|www\\.)[\.A-Za-z0-9\-]+\\.[a-zA-Z]{2,4}(/\S*)?';
db_query($query, $regexp);
在 Drupal 8+ 中,您可以执行以下操作:
$regex = '[\W]';
$query->addExpression("column, :regex, '')", 'alias', [':regex' => $regex]);