הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   בעיית עברית עם preg_match (https://hosts.co.il/forums/showthread.php?t=74923)

Matan Levy 28-05-09 11:37

בעיית עברית עם preg_match
 
אהלן,
בניתי פונקציה שבודקת האם מחרוזת שמתקבלת נמצאת בטווח ערכים שמתקבל:

PHP קוד:

function checkChars($str,$a,$b)
{
   
$ab='/^[^]{'.$a.','.$b.'}$/';
   if (!
preg_match($ab,$str)) return 0;
   return 
1;


הפונקציה מחזירה 1 אם מספר התווים של str נמצא בין a ל b (כולל),
אחרת - מחזירה 0.

עם אנגלית מספרים ותווים זה עובד בלי בעיה.
חקרתי את העניין קצת לעומק וגיליתי שתווים עבריים (א-ת) הוא סופר פעמיים.

א - 2 תווים.
אבג - 6 תווים.
אבגדהוזחטיכלמנצעפצקרשת - 44 תווים.

הקידוד הוא utf-8.
מה אוכל לעשות?

תודה!

Davieh 28-05-09 14:08

גם לי היית אותה הבעיה, רק במקרה אחר, לא הצלחתי לעשות בדיקה על תווים בעברית עם preg_match
במקרה שלי זה היה בדיקה של שם משתמש\ סיסמא אז השתמשתי ב HTMLSPECIALCHARS וכדומה ..

אני יחזור לשאלה שלך, אני לא יודע את הפיתרון, ומצטרף אליך גם.

Daniel 28-05-09 14:21

יש המון פונקציות שהם utf8-safe שאנשים יצרו.
אגב - כדי לבדוק אורך לא עושים את זה, אלא isset($str[...])

Matan Levy 28-05-09 14:55

ציטוט:

נכתב במקור על ידי MasterT (פרסם 717559)
יש המון פונקציות שהם utf8-safe שאנשים יצרו.
אגב - כדי לבדוק אורך לא עושים את זה, אלא isset($str[...])

לא הבנתי.

vadimg88 28-05-09 15:00

כשאתה משתמש ב UTF וכותב בעברית מספר התווים גדול יותר.

Matan Levy 28-05-09 16:09

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 717585)
כשאתה משתמש ב UTF וכותב בעברית מספר התווים גדול יותר.

זה אומר שכדאי להשתמש בקידוד אחר(עברית)?

Shay Ben Moshe 28-05-09 16:12

למה שלא תשתמש בstrlen פשוט?
http://il.php.net/manual/en/function.strlen.php

vadimg88 28-05-09 16:58

@מתן - לא. זה אומר שצריך למצוא דרך לעשות את מה שהוא רוצה שיתמוך ב UTF8.

ציטוט:

למה שלא תשתמש בstrlen פשוט?
http://il.php.net/manual/en/function.strlen.php
כי זה סופר את כמות התווים בערך, לא אומר אם הוא נמצא בין לבין.

Matan Levy 28-05-09 18:51

STRLEN היא אינה תומכת בספירת 500 תווים.
באיזה דרך אני יכול לסדר את הבעיה עם הפונקציה?

vadimg88 28-05-09 19:08

הנה זה יתמוך ב multibyte וגם הורדתי את ה preg_match והחלפתי בפקודת IF פשוטה.

PHP קוד:

<?php

/**
 * Count number of chars in a string 
 * Supports multi byte chars
 *
 * @param string $string
 */
function countChars$string$encoding='UTF-8' )
{
    return 
mb_strlen($string$encoding);
}

/**
 * Check if the given int is between two values
 *
 * @param int $value
 * @param int $firstElement
 * @param int $secondElement
 * @return bool
 */
function valueInBetween$value$firstElement$secondElement )
{
    return ( (int) 
$value $firstElement && (int) $value $secondElement ) ? TRUE FALSE;
}

# Count english
$string "asfcas";
echo 
countChars($string);

# Count hebrew multi byte
$string "דגעגכדעיגד";
echo 
countChars($string);

# Check if it's bettwen two values, English
$string "asfcas";
var_dump(valueInBetween(countChars($string), 4111)); // true

# Check if it's bettwen two values, Hebrew
$string "שגדעגיעק";
var_dump(valueInBetween(countChars($string), 4111)); // true

$string "שגדעגיעק";
var_dump(valueInBetween(countChars($string), 12111)); // false



כל הזמנים הם GMT +2. הזמן כעת הוא 14:20.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ