簡體   English   中英

使用preg_replace替換php中的所有實例

[英]Using preg_replace to replace all occurrences in php

正則表達式絕對是我的弱點,這一點讓我完全難過。 我正在構建一個相當基本的搜索功能,我需要能夠根據以下模式更改我的用戶輸入:

學科:

%22first set%22 %22second set%22-drupal -wordpress

期望的輸出:

+"first set" +"second set" -drupal -wordpress

我希望我能得到更多的幫助,因為我通常希望至少發布我到目前為止的解決方案,但在這一方面我不知所措。

任何幫助表示贊賞。 謝謝。

似乎您的數據是URL編碼的。 如果您應用urldecode ,您將獲得

"first set" "second set" -drupal -wordpress

(我假設你在-drupal之前有一個空格)。

現在你必須添加+ 同樣,我假設您必須在沒有-並且不在引號內的所有單詞之前添加這些:

$str = '"first set" "second set" -drupal -wordpress foo';
echo preg_replace('#( |^)(?!(?:\w+"|-| ))#','\1+', $str));
// prints +"first set" +"second set" -drupal -wordpress +foo

更新:如果您不能使用urldecode ,您可以使用str_replace%22替換為"

preg_replace('/%22((?:[^%]|%[^2]|%2[^2])*)%22/', '+"$1"', $str);

說明: $1是一個反向引用,引用正則表達式中的first () section,在本例中為((?:[^%]|%[^2]|%2[^2])*) 並且[^%]和之后的替換(...|...|...)會阻止%22之間由於貪婪而被匹配。 請參見http://en.wikipedia.org/wiki/Regular_expression#Lazy_quantification

我在JavaCC示例中找到了匹配塊注釋( /* */ )的技術,我找不到任何解釋它的其他網頁,所以這里有一個更清晰的例子:匹配12345 12345........12345之間的文本塊12345........12345之間沒有12345: /12345([^1]|1[^2]|12[^3]|123[^4]|1234[^5])*12345/

這是你在找什么?

<?php
  $input = "%22first set%22 %22second set%22-drupal -wordpress";
  $res = preg_replace( "/\%22(.+?)\%22/","+\"(\\1)\" ", $input);
  print $res;
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM