2011-08-15 7 views
2

정규 표현식에서 문자열을 만들려고합니다. Kohana 프레임 워크의 라우팅 시스템에서 정규 표현식과 비슷한 것을 사용하여 라우트를 설정할 수 있다는 것을 알았습니다. 그런 다음 설정 한 경로와 일치하는 URL을 만들 수 있습니다. 나는 비슷한 것을하려고 노력하고 있지만, 그것을 할 수있는 깨끗한 방법을 찾을 수는 없습니다. 내가 예를 들어 다음과 같은 정규 표현식있어 : 나는 "응용 프로그램" "A", "컨트롤러" "B"를 동일 동일 말할 수 있도록하려면 지금정규식에서 문자열 만들기 PHP

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/ 

를, "방법", "C"를 동일 "parameters"는 "d"와 같습니다. 그런 다음 지정된 값으로 부품을 대체하는 문자열을 가져와야합니다. 나는 이것을 할 수있는 좋은 방법을 찾을 수 없습니다. 기본적으로 두 가지 방법을 생각했습니다 : 1) 정규 표현식의 해당 값을 지정된 값으로 바꾸거나 2) 문자열을 작성하고 "적절한"문자열로 쉽게 변환 할 수있는 사용자 정의 "정규식 구문"을 작성하십시오 "필요한 경우 정규 표현식. Kohana는 후자를 사용하지만, 두 방법 모두 나에게 상당히 나쁜 것처럼 들립니다. 어떻게 할거 니?

편집 : 조금 명확히하려고합니다. 예를 들어 preg_match() : "myApplication/myController/myMethod/myParameters"를 사용하여 위의 정규 표현식에 다음 문자열을 전달합니다. 이렇게하면 "application", "controller", "method"및 "parameters"인덱스가있는 4 개의 항목과 해당 값이 포함 된 두 개의 항목이있는 배열이 반환됩니다. 이제는 정규 표현식의 패턴을 사용하여 "myApplication/myController/myMethod/myParameters"라는 문자열을 만들어야합니다. 어떻게 PHP를 사용하여 이것을 할 수 있습니까?

+1

이것은 명확하지 않습니다. 입력 문자열과 해당 출력 문자열의 예를 들어 주시겠습니까? –

+0

저는 PHP와 정규 표현식에 매우 익숙하지만, 당신이 무엇을 요구하고 있는지 전혀 알지 못합니다. 귀하의 질문은 제게 의미가 없으므로, 질문을 처음부터 수정하는 것이 좋습니다. 그러나 누가 알겠습니까? 아마도 다른 사람이 이해할 수 있습니다. – Gerry

+0

@Oli Charlesworth, Gerry : 이해하기 힘들 것 같아요. 직접 설명하는 데 어려움을 겪고있었습니다 ... 나는 몇 가지 텍스트를 추가했으며 지금은 더 명확 해 지길 바랍니다. – Frog

답변

2

그것은 preg_match이 (정규 표현식 사용, 물론입니다 more here) 라는 이름의 캡처 그룹에 대한 지원을하고 주어진 매우 간단해야한다.

from PHP documentation :

<?php 

$str = 'foobar: 2008'; 

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches); 

/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
* the above form is recommended for backwards compatibility */ 
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches); 

print_r($matches); 

?> 

위의 예제 출력됩니다 : 귀하의 경우 그래서

Array 
(
    [0] => foobar: 2008 
    [name] => foobar 
    [1] => foobar 
    [digit] => 2008 
    [2] => 2008 
) 

, 당신은 예를 들어, 당신의 $matches 배열을 사용할 수 있습니다 $matches['application'].


편집 : 좋아, 내가 충분히 질문을 이해하지 못했다.

문자열을 생성하는 데있어 정규 표현식을 사용할 때 명백한 문제는 정규 표현식이 무한 문자열과 일치 할 수 있다는 것입니다.

cat rat 
cat rat 
cat rat 

는 아무것도 정의되지 않은

하지만 당신의 예제에서

없는 등 예를 들어, /cat\s+rat/는 모두 일치합니다.

따라서 좁은 유스 케이스가 주어지면 정규 표현식의 하위 집합 인 "안전한"또는 단일 생성 가능 언어를 정의하려는 경향이 좋습니다. 그런 다음 /\(\?P?<(\w+)>\)/ 번을 해당 캡처 그룹의 값으로 바꿀 수 있습니다.

하지만 PHP는 한 번에 대체하는 동안 변수를 액세스하기 위해 캡처 그룹의 값을 사용하지 않으므로 여러 단계에서이를 수행해야합니다.위의 그룹의 모든 출현을 일치시키고, 명명 된 그룹을 추출한 다음, '(?P<' . $match . '>)''(?<' . $match . '>)'에서 간단한 문자열 대체를 $$match으로 (보다 안전한 방법으로) 수행합니다 ($matches$match).

+0

답변 해 주셔서 감사합니다! 나는 그것이 바로 지금 내가하고있는 일이라는 것을 이해한다. 내가 뭘 하려는지는이 작업을 반대로하는 것입니다 : 나는 (당신의 예제에서) "이름"이 무엇인지, 그리고 "숫자"가 무엇인지 알고 있습니다, 이제 저는 알고있는 값을 가진 정규식 패턴에 해당하는 문자열을 만들고 싶습니다. . 예를 들어, "name"은 "test"와 같고 "digit"는 "2000"과 같습니다. 따라서 함수는 "test : 2000"이라는 문자열을 만들어야합니다. – Frog

+0

오 ... 알 겠어 ... 좀 더 까다 롭습니다. 이것을 반영하는 편집 ... –

+0

$ str = "$ name : $ digit" – Gerry