2012-04-13 40 views
5

Giả sử bạn có chuỗi này:Cách nhanh nhất để tìm thấy nhân vật chữ hoa đầu tiên trong một chuỗi

hiThere

cách nhanh nhất để tìm thấy nơi nhân vật chữ hoa đầu tiên là như thế nào? (T trong ví dụ này)

Tôi lo lắng về hiệu suất vì một số từ khá dài.

+5

Bạn muốn viết hoa chữ cái đầu tiên hoặc chỉ chữ hoa đầu tiên "T"? – safarov

+0

tất nhiên là chữ hoa đầu tiên! –

+1

@ HardikPatel: Nó không phải là "tất nhiên", nó không rõ ràng từ câu hỏi. –

Trả lời

13

dễ nhất là nên sử dụng preg_match (nếu chỉ có 1 trận đấu) hoặc preg_match_all (nếu bạn muốn tất cả các trận đấu) http://php.net/manual/en/function.preg-match.php

preg_match_all('/[A-Z]/', $str, $matches, PREG_OFFSET_CAPTURE); 

Không chắc chắn nếu nó là nhanh nhất ..

+0

'PREG_OFFSET_CAPTURE' - đó là lá cờ tôi đang cố gắng để có được vị trí phù hợp. – leepowers

+0

hoàn hảo !!! hoạt động tốt. cảm ơn bạn! : D – Martin

1

Sử dụng strpos().

echo strpos($string, "T"); 
+0

Anh ấy muốn mã chung không cụ thể cho mã đó. Nói mã của bạn sẽ thất bại khi anh ta muốn "X" từ chuỗi "abcXyz" –

+0

@UmakantPatil: Câu hỏi đã được chỉnh sửa kể từ khi tôi viết câu trả lời này. (3 lần). Ý nghĩa của nó đã bị thay đổi rất nhiều kể từ đó. Tôi sẽ đánh giá cao nếu bạn có thể xem xét các sửa đổi lần sau khi downvoting một câu trả lời rất cũ (Câu trả lời này là hơn một năm tuổi). –

+0

Xin lỗi về điều đó. Tôi có thể đã hủy bỏ phiếu bầu nhưng tôi không thể làm điều đó vì nó nói "Phiếu bầu của bạn bị khóa" –

6

để tìm các chữ hoa đầu tiên, tôi sẽ sử dụng PREG_OFFSET_CAPTURE cờ của preg_match:

$string = "hiThere"; 

preg_match('/[A-Z]/', $string, $matches, PREG_OFFSET_CAPTURE); 

print_r($matches[0]); 

nào trả về như sau:

Array ([0] => T [1] => 2) 

Bạn có thể bọc logic này thành một chức năng và sử dụng nó hơn và hơn:

function firstUC ($subject) { 
    $n = preg_match('/[A-Z]/', $subject, $matches, PREG_OFFSET_CAPTURE); 
    return $n ? $matches[0] : false; 
} 

echo ($res = firstUC("upperCase")) ? $res[1] : "Not found" ; 
// Returns: 5 

echo ($res = firstUC("nouppers!")) ? $res[1] : "Not found" ; 
// Returns: Not found 
2

Tôi muốn tưởng tượng làm điều này:

strlen(preg_replace("/^([a-z]*)[A-Z].*$/", "$1", $str)); 

isThis =>2
largerWord =>6

+0

Tuyệt vời nhưng tôi không hoàn toàn hiểu tại sao tính năng này hoạt động. mặc dù tôi nhận được 12 trên chuỗi này '$ str = 'asas.2tAOPPr';':/ – Sarfaraaz

+0

K i figured it out. Nó cố gắng để lấy bộ ký tự đầu tiên tất cả đều là chữ thường. Nó không tính đến số nhưng hầu hết các chuỗi dây lạc đà sẽ không có số ở giữa nó. sau đó nhận được độ dài của những nhân vật đó. nếu nó không thể tìm thấy một kết quả phù hợp, nó sẽ trả về độ dài của toàn bộ chuỗi. – Sarfaraaz

+0

Khá nhiều. Đoán bạn có thể chạy "/^([^A-Z])*[A-Z].*$/" nếu không. –

0

Giải pháp cho ký tự a-z. Có lẽ wont làm việc unicode

preg_match('/[A-Z]/', $str, $m); 
if(isset($m[1])) { 
    echo 'First upper char is '.$m[1].' and located at '. strpos($string, "T"); 
} 
else { 
    'There is no upperchar'; 
} 
5

cách khác làm

$stringCamelCase = 'stringCamelCase';// hiThere 

Way với preg_split():

$array  = preg_split('#([A-Z][^A-Z]*)#', $stringCamelCase, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
echo strlen($array[0]);// $array = ['string', 'Camel', 'Case'] 

Way với strpbrk():

$CamelCase = strpbrk($stringCamelCase, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); 
echo strpos($stringCamelCase, $CamelCase); 
0

Dưới đây là một (nhiều hơn hoặc ít hơn) một giải pháp dòng.

$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ'); 

strcspn sẽ trở lại vị trí của sự xuất hiện đầu tiên của bất kỳ nhân vật trong đối số thứ hai, hoặc độ dài của chuỗi nếu không có nhân vật xảy ra.

Trả về độ dài của đoạn ban đầu của str1 không chứa bất kỳ ký tự nào trong str2.

$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ'); 
if ($pos < strlen($string)) { 
    echo "capital letter as index $pos"; 
} 
+3

Không an toàn cho địa phương !!! – hd1

0

Những gì tôi đã sử dụng trong ứng dụng của riêng tôi:

function acronyms($s){ 
    $s=str_replace(array('& ','of ','the ','and '),'',strtolower($s)); 
    $s=ucwords(trim($s)); //Collecting data 
    if(strlen($s)>0 && preg_match_all('/[A-Z]/',$s,$m)) return implode('',$m[0]); 
return $s; 
} 
1

Đã thời darndest với chức năng này cho đến khi tôi tìm thấy mảng là một đa chiều. Không thấy mã của ai đề cập đến điều này. Để có được vị trí của chữ cái viết hoa được viết hoa đầu tiên tôi đã sử dụng:

<?php 

$field = "i_select_Interior_Quote"; 
preg_match('/[A-Z]/', $field, $m, PREG_OFFSET_CAPTURE); 

$posi=$m[0][1]; 

echo '<br><br>'.$posi; // outputs 9 

?> 
Các vấn đề liên quan