在我的主目录中,我有一个drupal-6.14文件夹,其中包含Drupal平台.
从这个目录我使用以下命令:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Run Code Online (Sandbox Code Playgroud)
这个命令的作用是gzips文件夹drupal-6.14,不包括drupal-6.14/sites/ 除了sites/all和sites/default之外的所有子文件夹.
我的问题是关于正则表达式:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
该表达式可以排除我想要排除的所有文件夹,但我不太明白为什么.
使用正则表达式是一项常见任务
匹配所有字符串,但不包含子模式x的字符串除外.或者换句话说,否定子模式.
我(想)我明白解决这些问题的一般策略是使用否定的前瞻,但我从来没有理解到正面和负面的外观(前瞻/后退)是如何工作的.
多年来,我已经阅读了很多网站.PHP和Python正则表达式手册,其他页面,如http://www.regular-expressions.info/lookaround.html等,但我从来没有真正理解它们.
有人可以解释,这是如何工作的,也许可以提供一些类似的例子来做类似的事情?
- 更新一:
关于Andomar的回应:双重否定前瞻可以更简洁地表达为单一的积极前瞻性陈述:
即是:
'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
相当于:
'drupal-6.14/(?=sites(?:/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
???
- 更新二:
根据@andomar和@alan moore - 你不能互换双负前瞻以获得积极的前瞻.
我想执行以下mysql查询:
SELECT * FROM `gc_users` WHERE `name` LIKE '%anyname%'
Run Code Online (Sandbox Code Playgroud)
我尝试了这个没有成功:
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name");
$stmt->bindParam(':name', "%" . $name . "%");
$stmt->execute();
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE '%:name%'");
$stmt->bindParam(':name', $name);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
所以我问你是否可以在预编译语句中使用%通配符.
/编辑
谢谢.它的工作原理是bindValue:
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name");
$stmt->bindValue(':name', '%' . $name . '%');
$stmt->execute();
Run Code Online (Sandbox Code Playgroud) 我正在尝试为用户输入编写准备好的语句。参数编号是可变的,取决于用户输入。我正在尝试这个代码
php代码:
$string = "my name";
$search_exploded = explode( " ", $string );
$num = count( $search_exploded );
$cart = array();
for ( $i = 1; $i <= $num; $i ++ ) {
$cart[] = 's';
}
$str = implode( '', $cart );
$inputArray[] = &$str;
$j = count( $search_exploded );
for ( $i = 0; $i < $j; $i ++ ) {
$inputArray[] = &$search_exploded[ $i ];
}
print_r( $inputArray );
foreach ( $search_exploded as $search_each ) {
$x …Run Code Online (Sandbox Code Playgroud) 我正在为数据库设置基本的搜索查询,并将其返回到表中。我在准备好的语句中使用的语法遇到了问题。
我基于w3schools示例创建了初始设置。
搜索输入来自上的表单html page。这称为php file。
在中php file,我连接到SQL server并执行以下操作:
$search = $_POST['search'];
$stmt = $link->prepare("SELECT lname, fname FROM planner WHERE lname LIKE ?");
$stmt->bind_param('s', $search);
$stmt->execute();
$result = $stmt->get_result();
print_r($result);
if ($result->num_rows > 0) {
echo "<table><tr><th>Last Name</th><th>First Name</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["lname"]."</td><td>".$row["fname"]."</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
Run Code Online (Sandbox Code Playgroud)
我遇到的挑战是如何定义parametersLIKE以在准备好的语句构造中进行评估。W3Schools提供了许多LIKE parameters使用的各种组合的示例letters and %,但是我不确定将它们放在准备好的语句中的何处。我想将lname结果基于html页面上的表单提供的搜索条件。
该站点上的几篇旧文章都指向在字符串中设置条件。我不确定它是如何工作的。如果这是解决问题的好方法,我想了解更多有关此方法的信息。
感谢您提供的所有帮助。
我有一个包含学生记录的数据库,大约有 50 列左右,所有这些都需要可搜索。我熟悉如何通过附加字段来构建动态搜索查询。我似乎找不到任何关于使用本质上是动态的准备好的语句搜索 MySQL 数据库的示例。例如,在搜索时您只会输入您需要搜索的字段,因此,您如何根据用户输入构建动态准备好的语句?
这是一个如何在没有准备好的语句的情况下执行此操作的示例,但是这很容易发生 SQL 注入。我需要用一个函数“清理”每个变量。但是,使用准备好的声明会更安全。
function clean($con,$var){
$var = trim($var);
$var = strtolower($var);
$var = mysqli_real_escape_string($con,$var);
return $var;
}
if(isset($_REQUEST['sub'])){
if(isset($_REQUEST['student_fname'])){
$student_fname = null;
if($_REQUEST['student_fname'] != ''){
$student_fname = '&& `student_fname` = \''.clean($con,$_REQUEST['student_fname']).'\' ';
}
}
if(isset($_REQUEST['student_lname'])){
$student_lname = null;
if($_REQUEST['student_lname'] != ''){
$student_lname = '&& `student_lname` = \''.clean($con,$_REQUEST['student_lname']).'\' ';
}
}
$sql = "SELECT * FROM `student_records`
WHERE 1=1
$student_fname
$student_lname
ORDER BY class ASC, student_lname ASC";
echo $sql;
}
Run Code Online (Sandbox Code Playgroud)