2013-03-13 5 views
2

한 문자를 제외하고 올바른 정규식을 제공하는 쉬운 방법이 있는지 알아 내려고하고 있습니다. (PHP로 작업하는 경우).한 문자 잘못된 정규 표현식을 허용하는 방법

예를 들어, 패턴 '사과', 나는 어떤 좋은 방법이 있나요 등 "사과"뿐만 아니라 "appxes", "opples", "applis"

의뿐만 아니라 발생을 찾으려면 이것을 성취하기 위해서? 미리 감사드립니다!

답변

5

사용 levenshtein 기능. Here are the docs.

예를 들어 echo levenshtein("abcd","abce")1을 출력합니다.

편집 :이 기능은 길이가 다른 문자열을 비교하므로 추가 확인이 필요할 수 있습니다. 아래의 @ Vulcan의 설명을 참조하십시오.

+1

+1 나는 존재하지 않았다! –

+1

levenshtein ("abcd", "abcde")도''1 ''입니다. 이 함수는 스왑 된 문자를 고려하지 않습니다. 그것은 추가/누락 된 문자들도 설명합니다. 이 추가 기능이 바람직하지 않은 경우, 두 개의 문자열이 동일한 길이 인 경우'levenshtein' 만 계속하는 간단한 필터를 추가 할 수 있습니다. – Vulcan

+0

좋은 기능에 대해 알고, 감사합니다. 여기서 유일한 문제는 내가 말할 수있는 한 맥락에서 그렇게 잘 작동하지 않는다는 것입니다. 예를 들어 "여기 applis and oranges"라는 문자열을 생각해보십시오. 나는 "applis"와 "applis"패턴을 일치시키고 싶습니다. 단지 "applis"와 마스터 패턴 사이의 Levenshtein 거리를 결정하는 것이 아닙니다. 즉, 우리는 처음에는 상황에 따라 "applis"를 찾아야합니다. –

1

귀하의 정규식 문자열 :

[A-z]pples|A[A-z]ples|Ap[A-z]les|Appl[A-z]es|Appl[A-z]s|Apple[A-z] 
2

내가 정규식이 적합한 도구라고 생각하지 않습니다. 대신이 같은 것을 할 수 있습니다.

$temp = str_split ("apples"); 
$test = str_split ("appxes"); 
var_dump(array_diff($temp, $test)); 

출력 : 대신 정규식의

array(1) { [3]=> string(1) "l" } // 1 mismatch 
      ^// position ^//letter at mismatch 
+1

즉, 'count (array_diff (..)) == 1'을 확인 하시겠습니까? – Vulcan

+0

levenshtein 거리의 원시 버전으로 바뀌어도 괜찮은 접근 방식입니다. –

+0

@ Vulcan 예. 'levenshtein'이 훨씬 더 좋아 보인다. –

0

당신은 문자열을 X 글자로 흘렸을 수 있고 preg는 욕망 preg 일치 단어에서 X-1과 일치 할 수 있습니다.

관련 문제