2011-04-21 10 views
1

여기 내 첫 번째 질문입니다. 내가 추측 한 일을 할 필요가 단순한 PHP가 preg_replace() 교체하지만 난 정규식에 대한 지식이있다.간단한 PHP preg_replace

나는 여러 개의 (시작과 끝 모두 따옴표 포함) " + figure("br") + "에 의해 깨진 HTML formated 텍스트 문자열을 가지고 있습니다. <em class="br"></em>로 변경해야합니다. 여기서 'br'은 내가 보존해야하는 인수입니다.

대체 할 약 200 개 이상의 텍스트가 있습니다. 물론 전/후반부를 별도로 교체 할 수는 있지만 올바른 방법으로하고 싶습니다. 미리 감사 드리며 내 영어를 용서하십시오.

샘플 입력 : <p>Bien!</p> <p>Gana <b>Material</b> por el <b>Doble Ataque</b> al " + figure("bn") + "c6 y a la " + figure("br") + "h8.</p>

샘플 출력 : <p>Bien!</p><p>Gana <b>Material</b> por el <b>Doble Ataque</b> al <em class="bn"></em>c6 y a la <em class="br"></em>h8.</p>

[실제 데이터를 포함하기위한 편집] 우리가 당신에게 유용한 무언가를 제공하는 시나리오에 대해 좀 더 정보가 필요하다고 생각

+0

실제 예제 문자열과 예상되는 출력을 제공하십시오. – mario

+0

@mario 실제 정보 추가 – morgar

답변

1

, 그럼 나는 몇 가지 정규식가 탈출 사용하는 것이 가장 좋습니다 생각 소스 코드?

+0

예, 이전 코드를 새로운 간단한 형식으로 변환하려고합니다. 이제 샘플 입력과 출력을 추가했습니다. – morgar

+0

그 예에서 작동해야합니다. – mario

+0

그것은 작동합니다! 왜, 나는 약간의 정규식을 배워야하는지 모르겠다 :) 나는 텍스트 안에 조각들을 보여줄 필요가있는 체스 레슨들을 변환 중이다. 예전에는이 함수가 태그를 모든 세부 정보와 함께 삽입했습니다. 그것은 어떤 CSS로 더 쉽게 할 수 있습니다. 많은 도움을 주셔서 감사합니다. – morgar

2

. 당신이 무엇을 설명 할 수있는 가장 간단한 방법은 같은 것을 할 수 있습니다 :

$output = preg_replace('/.*\("br"\).*/', '<span class="br"></span>', $input); 

을하지만 그건 당신이 실제로 원하는 있는지 모르겠어요. 그러면 처음 문자열의 모든 텍스트가 제거되고 <span class="br"></span> 블록으로 바뀝니다. 남은 문자는 모두 <span class="br"></span>입니다.

foo<span class="bar"></span>baz 같은 블록으로 foo("bar")baz처럼 보이는 블록을 변경하는 것이 좋다고 나에게 들립니다.

$output = preg_replace('/\("(.*?)"\).*/', '<span class="$1"></span>', $input); 

그러나, 내가 질문을 읽어가는 길에 단지 내 추측이있다 : 그런 경우에, 당신은 아마 이런 식으로 뭔가를 할 것입니다. 문제를 실제로 해결하려면 , post_stringbr이 무엇을 나타내는 지, 그리고 어떻게 다를 수 있는지에 대해 조금 더 알아야합니다. 일부 샘플 입력 및 출력 텍스트가 도움이 될 수 있습니다.

편집 : 최근 편집 결과가 좀 더 명확 해졌습니다. 정규 표현식으로 JavaScript 나 다른 프로그래밍 언어를 구문 분석하려는 것 같습니다. 일반적으로 limitations of regex로 인해 완벽하게 수행 할 수 없습니다. 그러나, 다음은 대부분의 경우에 작동합니다 :

$pattern = '/(["\'])\s*\+\s*\w+\((["\'])(.*?)\2\)\s*\+\s*\1/' 
$output = preg_replace($pattern, '<span class="$3"></span>', $input); 

설명 :

/ 
(["\']) #Either " or '. This is captured in backreference 1 so that it can be matched later. 
    \s*\+\s* #A literal + symbol surrounded by any amount of whitespace. 
    \w+  #At least one word character (alphanumeric or _). This is "figure" in your example. 
    \(  #A literal (character. 
    (["\']) #Either " or '. This is captured in backreference 2. 
    (.*?) #Any number of characters, but the `?` makes it lazy so it won't match all the way to the last `") + "` in the document. 
    \2  #Backreference 2. This matches the " or ' from earlier. I didn't use ["\'] again because I didn't want something like 'blah" to match. 
    \)  #A literal) character. 
    \s*\+\s* #A literal + symbol surrounded by any amount of whitespace. 
\1   #Backreference 1, to match the first " or ' quote in the string. 
/

희망 비교적 이해하기 쉽다. 정규식 패턴이 무엇을하는지 설명하기가 어려울 수 있습니다. 그래도 이것이 여전히 어려울 경우 유감입니다. 그래도 혼란 스러우면 backreferenceslazy quantifiers에 대한 추가 정보가 있습니다.

역 참조 구문에 대해 잘 모르겠습니다. 요즘 PHP에서는 보통 코드를 작성하지 않습니다. 누구든지 나를 바로 잡고 싶어한다면 나는 그것을 환영한다.난 당신이 몇 가지를 변환하는 가정

// " + figure("br") + " 
$pre = '" + figure'; 
$post = ' + "'; 

// escape 
$pre = preg_quote($pre, "#"); 
$post = preg_quote($post, "#"); 

// then the regex becomes easy 
$string = preg_replace(
       "#$pre\(\"(\w+)\"\)$post#", 
       '<em class="$1"></em>', 
       $string 
); 

: 당신이 변수 전후 문자열 (또는 귀하의 경우와 같은 메타 문자 하나)이있는 경우

+0

더 자세한 정보를 포함하여 질문을 편집했습니다. 귀하의 답변에 감사드립니다. – morgar

+0

샘플 입력 및 출력을 추가했습니다. 정규식에서 어디에서 검색합니까? (그림) – morgar

+0

@morgar - 뭔가 빠졌음을 알았습니다. 죄송합니다. 지금 확인하십시오. –