2017-10-10 4 views
1

정규 표현식을 사용하여 문자열을 검색하고 여러 값을 바꾸고 URL을 작성하려고합니다. 나는 처음부터 정규식을 사용한 적이 없다. 그래서 약간 갇혀있다.PHP Regex preg_replace 여러 값 사이에 괄호

문자열은 [평방 괄호] 안에 식별자로 포함됩니다. 여러 접근법을 시도했습니다 - 정규식이나 preg_replace 메서드를 여러 정규식 줄을 사용하지 않고 여러 번 대체 할 수 있도록 구조화하는 방법을 이해하지 못합니다. 그러나이 방법은 제가 시도하는 방향입니다.

$string= '[mycode="gallery" type="single" id="1" data="only"]'; //INPUT 

    $string = preg_replace('/\mycode="(.*)"\]/', '$1/mycode"', $string); 
    $string = preg_replace('/\type="(.*)"\]/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\id="(.*)"\]/', '?id=$1', $string); 
    $string = preg_replace('/\data="(.*)"\]/', '&data=$1', $string); 
궁극적으로 출력

:

갤러리/_mycode_single.php ID = 1 개 & 데이터 =에만 나는 이것이 내가하지 않는 현재대로 작동하지 않는 것을 알고

합니다 ([]도 제거와 함께)? 여러 줄의 출력을 컴파일하는 방법을 알고 있어야한다. 어떤 도움을 주시면 감사하겠습니다. 감사!

+0

죄송합니다, 예 -] 나는 이전의 노력으로 남겨진 부분에 오타가 있다고 생각합니다. 전에 preg_replace_callback을 사용하지 않았습니다 - 자세히 설명해 주시겠습니까? 나는 당신이 그 것을 사용하여 다른 것을하기 전에 [] 괄호의 내용을 가져 오는 것을 의미한다고 가정하니? – WWD

+0

아래에서 제공 한 대답을 사용하여 작업하십시오. 다시 감사합니다. – WWD

답변

0

두 레이어로 이동해야합니다. 먼저 [] 사이의 모든 항목을 가져온 다음 필요에 따라 값을 바꿉니다. 이를 수행하려면 preg_replace_callback 을 사용할 수 있습니다.

$string= '[mycode="gallery" type="single" id="1" data="only"]'; 
echo preg_replace_callback('/\[([^\]]+)\]/', function($match) { 
    $string = preg_replace('/\h*mycode="([^"]+)"\h*/', '$1/mycode', $match[1]); 
    $string = preg_replace('/\h*type="([^"]+)"\h*/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\h*id="([^"]+)"\h*/', '?id=$1', $string); 
    $string = preg_replace('/\h*data="([^"]+)"\h*/', '&data=$1', $string); 
    return $string; 
}, $string); 

귀하의 정규식 몇 가지 이유에 대해 작동하지 않았다

  1. 당신의 문자열이 정규식 탈출에 ]
  2. 백 슬래시로 끝 또는 메타 문자를 생성하지 않는, \d 숫자 \t이입니다 탭.
  3. URL을 구축하면 반환 된 값에 따옴표를하지 않으려면 당신은 또한 선행 및 후행 공백
  4. 을 손질 할 필요가

데모 : https://3v4l.org/KDD0B

+0

감사합니다. 솔루션이 완벽하게 작동했습니다. – WWD