1

簡単に言え
ば、このような文字列を考えると-

MAX_checkTime_Hour('0,1', '=~') and (MAX_checkTime_Day('1,2', '=~') or MAX_checkTime_Day('1,2', '=~')) and MAX_checkGeo_Country('DZ,AO,BJ)

またはなど<br />のパターンの前後にタグを挿入したいので、出力は-and MAX_and (MAX_and ((MAX_

MAX_checkTime_Hour('0,1', '=~')<br /> and <br />(MAX_checkTime_Day('1,2', '=~') or MAX_checkTime_Day('1,2', '=~'))<br /> and <br />MAX_checkGeo_Country('DZ,AO,BJ)

私がこれまでに行ったこと
次の正規表現の置き換えで、私はもうすぐそこにいます。タグの挿入<br />は機能していますが、固定数の&nbsp;sを挿入する必要があります-

preg_replace("/\s+and\s+MAX_/",'<br />&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;<br />MAX_',$str);

私がしたかった-

  • 空白の正確な数を保持します。
  • の前の最初の括弧の正確な数を保持しますMAX_

したがって、元の文字列がこのようなものだった場合-

MAX_checkTime_Hour('0,1', '=~') <3 white spaces here> and <5 white spaces here> #2 first brackets here#MAX_checkTime_Day('1,2', '=~')

出力を-にしたい

MAX_checkTime_Hour('0,1', '=~')<br /> <3 white spaces here> and <5 white spaces here> <br /><first brackets here>MAX_checkTime_Day('1,2', '=~')

更新
空白の可変数が変数に格納されると仮定して、次のことを試しましたが、機能しませんでした-

preg_replace("/{\s+}and{\s+}MAX_/",'<br />$1and$2<br />MAX_',$str);
4

3 に答える 3

1

これを試して:

$result = preg_replace('/(?<=and)(?=[\s(]+MAX_)/im', '<br />and<br />MAX_\'', $subject);

RegExの説明

<!--
(?<=and)(?=[\s\(]+MAX_)

Options: case insensitive; ^ and $ match at line breaks

Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=and)»
   Match the characters “and” literally «and»
Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=[\s\(]+MAX_)»
   Match a single character present in the list below «[\s\(]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
      A whitespace character (spaces, tabs, and line breaks) «\s»
      A ( character «\(»
   Match the characters “MAX_” literally «MAX_»
-->
于 2012-05-08T09:44:54.893 に答える
1

ソース(3番目のMAX_の直前にあります)の'または'演算子を忘れたと思います。altがあります。正規表現のバージョン-より一般的であり('および'&'または'演算子の両方に一致して安全に置き換えることができるため)、もう少し最適化されています(先読み/後読み構文を使用しないため):

$result = preg_replace('/(\s+(and|or)\s+)(\(*MAX_)/', '<br/>$1<br/>$2', $str);

また、DRY互換であり、置換文字列にはソース文字列の一部が含まれていません

于 2012-05-08T10:01:44.913 に答える
0

どうですか:

$str = "MAX_checkTime_Hour('0,1', '=~') and (MAX_checkTime_Day('1,2', '=~') or MAX_checkTime_Day('1,2', '=~')) and MAX_checkGeo_Country('DZ,AO,BJ)";

echo preg_replace("/(\s+)and(\s+)(\(*MAX_)/", "<br />$1and$2<br />$3", $str);

出力:

MAX_checkTime_Hour('0,1', '=~')<br /> and <br />(MAX_checkTime_Day('1,2', '=~') or MAX_checkTime_Day('1,2', '=~'))<br /> and <br />MAX_checkGeo_Country('DZ,AO,BJ)
于 2012-05-08T10:04:54.587 に答える