2009-07-09 3 views
1

preg_replace에서 두 개의 정규식을 사용하여 배열의 항목을 일치시키고 바꿀 수 있습니까? 그래서 예를 들면 :두 정규식을 사용하여 배열의 항목 바꾸기

Array 
(
    [0] => mailto:[email protected] 
    [1] => mailto:[email protected] 
    [2] => mailto:[email protected] 
    [3] => mailto:[email protected] 
    [4] => mailto:[email protected] 
    [5] => mailto:[email protected] 
    [6] => mailto:[email protected] 
} 

당신은 두 개의 변수가 정규식 문자열 잡고 있습니다 :

당신이 가진 가정 내가 할 수

$reg = '/mailto:[\w-][email protected]([\w-]+\.)+[\w-]+/i'; 
$replace = '/[\w-][email protected]([\w-]+\.)+[\w-]+/i'; 

을 :

을 위해
preg_replace($reg,$replace,$matches); 

교체 "mailto : [email protected]"과 "[email protected]"의 각 색인에 와이.

+1

대답 (들) 아래 1() 하위 표현으로 확장됩니다에 $ 1이다. 관심이있는 부분을 (와) 추가했습니다. – gahooa

+1

preg_match()의 세 번째 매개 변수는 배열이 될 수 있습니다. 이 경우 preg_match()는 배열을 반환합니다. – gahooa

답변

1
foreach($array as $ind => $value) 
    $array[$ind] = preg_replace('/mailto:([\w-][email protected]([\w-]+\.)+[\w-]+)/i', '$1', $value); 

EDIT : gahooa의 해결책은 preg_replace 내부에서 루프를 이동하기 때문에 더 나을 것 같습니다.

+0

$ 1은 무엇을 나타 냅니까? – Graham

+0

첫 번째 일치 그룹입니다. 이 경우 "([\ w -] + @ ([\ w -] + \.) + [\ w -] +)"와 일치합니다. –

1

을 내가 다른 사람으로, 당신은 '$ 1'submatch 그룹을 찾고 있다고 생각 :

$newArray = preg_replace('/mailto:([\w-][email protected]([\w-]+\.)+[\w-]+)/i', '$1', $oldArray); 

여기를 참조하십시오

을 테스트하지 않았습니다 이미 지적했다. 사실

// strip 'mailto:' from the start of each array entry 
$newArray = preg_replace('/^mailto:\s*/i', '', $array); 

, 당신의 정규식의 사용을 허용하지 않는보고 ':'어디서나 전자 메일 주소, 간단한 str_replace()와 함께 할 수 그런데 왜 당신은 다음을 수행 할 수 없습니다 당신이없는 str_replace를 사용해야 대체 이러한 유형의

// remove 'mailto:' from each item 
$newArray = str_replace('mailto:', '', $array); 
1

그것은 모자의 일종 빠른 and strongly suggested by the online documentation입니다 :

$array = str_replace('mailto:', '', $array); 
+0

이 상황에서'str_replace'의 사용에 확실히 동의하십시오. 그것은 gahooa의 정규 표현식보다 두 배 이상 빠릅니다. 기록을 위해, 나는 또한 substr ($ str, 7) 구조로 루프를 시도했다. 그것은 정규식보다 빠르지 만'str_replace'를 능가하지 않습니다. – Geert

관련 문제